2

我知道以下内容:

  • 'L'- 长
  • 'P'- 指针
  • 'I'- 整数
  • 'V'- 空白

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

背景

我一直在互联网上搜索基于 WinForms 的应用程序的原生 Ruby 编程示例。为了简化编码(试图避免使用 wxRuby,并且也是 .NET 的粉丝),我考虑了 Ruby 的 .NET 附加组件 IronRuby,但我首先希望能够首先在纯 Ruby 中显式编码。

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

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

..但是我不能在没有空参数的情况下执行CreateWindowOr 。CreateWindowEx如果有任何帮助,我在这里找到了如何在 Python 中执行此操作在 WinAPI 下)。

使用 Win32API:msdn.microsoft.com/en-us/library/ff381397(v=VS.85).aspx

[编辑]
好吧,我想我可能刚刚用这个链接解决了我自己的问题 (警告:可能包含不适当的内容)[链接]

我更多地使用该论坛作为参考,并在我自己周围做了一些摆弄:
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)

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

4

3 回答 3

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 使消息框没有所有者窗口。


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

于 2013-01-06T13:43:27.663 回答
0

由于我不在 Windows 上,因此我没有对此进行测试,但我认为您打算使用常量DL::NULL. 您可以在此处(倒数第二行)看到它的实际效果,它看起来与您的用例相似。希望这会有所帮助!

于 2011-11-11T21:20:11.797 回答
-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
于 2014-04-10T18:23:22.417 回答