我知道以下几点:
'L'
'P'-指针
'I'-整数
'V'无效
我的问题是在执行api调用时不能传递空指针。例如:['L', 'P', 'L'] -> api.call(0, nil, 0) :: ArgumentError: Null pointer given。我的问题是:是否有更多的参数类型我不知道,我应该做什么来传递一个空指针作为方法参数?
背景
我一直在互联网上搜索基于winforms的应用程序的原生ruby编程示例。我考虑过将.net添加到ruby中,称为ironruby,以简化编码(试图避免wxruby,同时也是一个.net爱好者),但我首先希望能够使用纯ruby显式编码。
现在,我已经成功地实现了在user32.dll对象中测试过的大多数地址,例如:

api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
# or
api = Win32API.new('user32', 'MessageBeep', ['L'], 'I')

…但是如果没有空参数,我就不能执行CreateWindowCreateWindowEx
如果有什么帮助的话,我已经在pythonhere中(在winapi下)找到了这个方法。
使用win32api:msdn.microsoft.com/en-us/library/ff381397(v=vs.85).aspx
[编辑]
好吧,我想我已经解决了我自己的问题
(警告:可能包含不适当的内容):[link]
我更多地把那个论坛当作参考,在自己身上做了一些手脚:
createwindow = Win32API.new("user32","CreateWindowEx",'lpplllllllll','l')
showwindow = Win32API.new('user32','ShowWindow',%w(l l),'l')
hWND = createwindow.call((0x00000100|0x00000200),"static", "Window Title",((0x4000000|0x80000000|0)|0x02000000),0,0,600,400,0,0,0,0)
showwindow(hWND, 1)
“窗口”显示后发生的唯一事情是崩溃…这可能是因为一些错误的处理,但是,我很高兴我得到了它的工作(一点点)!只需要找出剩下的…

最佳答案

不要使用Win32API(我相信这是建立在模糊和很少使用的DL模块之上的),您可能会发现使用新的和改进的FFI模块可以获得更好的里程数。
以下是如何:
(1)获得FFI:
gem install ffi
(2)然后尝试:

require 'ffi'

module Win32
   extend FFI::Library
   ffi_lib 'user32'
   attach_function :messageBox,
       :MessageBoxA,[ :pointer, :string, :string, :long ], :int
end

rc = Win32.messageBox(nil, "Hello Ruby user!", "FFI is easy", 0x40)

puts rc

这似乎比你在编辑中发布的解决方案更容易。
注意:空指针代替hwnd使消息框没有所有者窗口。
以下是一些可能有帮助的链接:
Constants to customise your message boxes(对话框按钮和图标)
另一个example using FFI instead of Win32API

09-10 04:32
查看更多