У меня есть следующий код, который подходит, если я указываю неверные параметры (хотя, очевидно, не работает), но всякий раз, когда я даю точные параметры, ruby segfaults. Я склонен полагать, что это проблема с моим кодом и/или способностью ruby фактически вызывать эту функцию API, но я хотел бы получить дополнительную информацию. Я пробовал как Win32API
, так и DL::Importer
с теми же результатами. Есть ли способ заставить это работать?
Для любопытных здесь доступна полная предыстория, включая попытки с Win32API
и DL::Importer
на разных ветках. Вы ищете examples/windows-test
в обоих случаях.
EDIT: мне удалось заставить RegisterClassEx
работать, но это все еще не помогает. Ruby молча падает в CreateWindowEx
.
Следующее дает вывод следующим образом:
wndproc: 4293787656
hInstance: 4194304
Вход в RegisterClassEx
Класс окна: 49795
Вход в CreateWindowEx
РЕДАКТИРОВАТЬ 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
RegisterClassEx
? - person Chibueze Opata   schedule 18.06.2012#to_i
- это способDL
получить указатель на структуру. Почему они просто не сделали новую функцию с более подходящим названием, я не знаю. Но вот оно. - person Matthew Scharley   schedule 18.06.2012