次のコードは、無効なパラメーターを指定しても問題ありませんが (明らかに機能しません)、正確なパラメーターを指定すると、ルビーのセグメンテーション違反が発生します。これは私のコードの問題か、この API 関数を実際に呼び出す ruby の能力に問題があると思いがちですが、もう少し情報が欲しいです。私は両方Win32API
で試しましDL::Importer
たが、同じ結果でした。これを機能させる方法はありますか?
好奇心旺盛な方のために、さまざまなブランチでの試行を含む、完全な背景がここにあります。どちらの場合も探しています。Win32API
DL::Importer
examples/windows-test
編集:私はなんとかRegisterClassEx
仕事をすることができましたが、これはまだ役に立ちません。Ruby は で静かにクラッシュしCreateWindowEx
ます。
次のような出力が得られます。
wndproc: 4293787656
hInstance: 4194304
RegisterClassEx に入る
Window Class: 49795
CreateWindowEx に入る
EDIT 2 :進行中のコードが少し大きくなり、すべてをSEに貼り付けました。すべての背景が必要な場合は、上のリンクで見ることができます。ただし、関連するすべてのものをここに含めようとしました。
class Windows
def initialize
puts "wndproc: #{Win32::User32::WNDPROC}"
hInstance = Win32::Kernel32::GetModuleHandle(DL::NULL)
puts "hInstance: #{hInstance}"
puts "Entering RegisterClassEx"
@window_class_struct = Win32::User32::WNDCLASSEX.malloc
@window_class_struct.cbSize = Win32::User32::WNDCLASSEX.size
@window_class_struct.style = Win32::User32::CS_HREDRAW | Win32::User32::CS_VREDRAW
@window_class_struct.lpfnWndProc = Win32::User32::WNDPROC
@window_class_struct.cbClsExtra = 0
@window_class_struct.cbWndExtra = 0
@window_class_struct.hInstance = hInstance
@window_class_struct.hIcon = 0
@window_class_struct.hCursor = 0
@window_class_struct.hbrBackground = Win32::User32::COLOR_WINDOWFRAME
@window_class_struct.lpszMenuName = DL::NULL
@window_class_struct.lpszClassName = 'ruby-skype'
@window_class_struct.hIconSm = 0
p @window_class_struct
@window_class = Win32::User32::RegisterClassEx(@window_class_struct.to_i)
puts "Window Class: #{@window_class}"
puts "Entering CreateWindowEx"
@window = Win32::User32::CreateWindowEx(0, 'ruby-skype', 'ruby-skype', Win32::User32::WS_OVERLAPPEDWINDOW,
0, 0, 200, 200, DL::NULL, DL::NULL, DL::NULL)
puts "Exited CreateWindowEx"
p @window
end
module Win32
module Types
def included(m)
m.module_eval {
include ::DL::Win32Types
# @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx
typealias('HBRUSH', 'HANDLE')
typealias('HCURSOR', 'HANDLE')
typealias('HICON', 'HANDLE')
typealias('HMENU', 'HANDLE')
typealias('HMODULE', 'HANDLE')
typealias('LPCTSTR', 'unsigned char *')
typealias('LPVOID', 'void *')
typealias('WNDPROC', 'void *') # Actually a function pointer
typealias('WNDCLASSEX', 'void *') # struct
}
end
module_function :included
end
module User32
extend DL
extend DL::Importer
dlload 'user32'
include Types
extern 'HWND CreateWindowEx(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE)'
WNDPROC = set_callback DL::TYPE_LONG, 4 do |window_handle, message_id, wParam, lParam|
puts "WM: #{message_id}"
end
end
end
end
Windows.new