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

时间:2011-11-11 20:41:17

标签: ruby winapi parameter-passing null-pointer

我知道以下内容:

  • 'L' - 很长
  • 'P' - 指针
  • 'I' - 整数
  • 'V' - Void

我的问题是,当我执行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')

..但我无法执行CreateWindowCreateWindowEx没有空参数。 如果它有任何帮助,我已经在Python here(在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)

显示'窗口'后发生的唯一事情是崩溃......这可能是因为一些不正确的处理,但是,我很高兴我让它工作(一点点)!只需要弄清楚剩下的......

3 个答案:

答案 0 :(得分:4)

使用新的和改进的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使消息框没有所有者窗口。

<小时/> 以下是一些可能有用的链接:

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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