什么是Ruby Win32API参数| 如何传递空指针?

我知道以下内容:

  • 'L' – 很长
  • 'P' – 指针
  • 'I' – 整数
  • 'V' – 无效

我的问题是,当我执行API调用时,我无法传递空指针。 例如: ['L', 'P', 'L'] -> api.call(0, nil, 0) :: ArgumentError: Null pointer given 。 我的问题是:是否有更多我不知道的参数类型以及如何将空指针作为方法参数传递?

背景

我一直在互联网上搜索基于WinForms的应用程序的原生Ruby编程示例。 为了简化编码(试图避免使用wxRuby,以及.NET风扇),我已经考虑过将Ruby添加到Ruby中称为IronRuby,但我首先希望能够首先在纯Ruby中进行显式编码。

现在,我已经成功地实现了我在user32.dll对象中测试过的大多数地址,例如:

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

..但是我不能在没有null参数的情况下执行CreateWindowCreateWindowEx 。 如果它有任何帮助,我已经在Python中找到了如何做到这一点 (在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(ll),'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使消息框没有所有者窗口。


以下是一些可能有用的链接:

  • 用于自定义消息框的常量 (对话框按钮和图标)
  • 另一个使用FFI而不是Win32API的示例

我没有测试过这个,因为我不在Windows上,但我认为你打算使用常量DL::NULL 。 你可以在这里看到它(倒数第二行),它看起来与你的用例类似。 希望有用!

 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