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

Posted

技术标签:

【中文标题】什么是 Ruby Win32API 参数 |如何传递空指针?【英文标题】:What are the Ruby Win32API Parameters | How do I pass a null pointer? 【发布时间】:2011-12-27 08:00:47 【问题描述】:

我知道以下几点:

'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')

..但是我不能在没有空参数的情况下执行 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)

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我尝试了您的建议,一遍又一遍地确认我没有错误...require 行成功运行,但是当我运行此行时:puts(DL::NULL) 它给了我这个错误:NameError: uninitialized constant NULLputs(DL) 按预期返回 DL【参考方案2】:

不要使用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

【讨论】:

您可能想考虑在代码中使用括号@Assad,只是为了像我这样的复制和粘贴。示例:请参阅我上面的答案。在我复制你的代码之后,它对我来说肯定会更好。无论如何,只是来自粉丝。 @DouglasG.Allen:好建议。我原以为您只是编辑了答案以添加括号,而不是复制粘贴两个字符不同的新答案。 嗯,这是供我和其他人参考的。【参考方案3】:
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

【讨论】:

我能够成功地使用 Win32API 和 ffi 设置消息框,但我真正的目标是一个实际的表单 - 我可以绘制的东西,提供按钮和文本字段 - 功能相同的东西C++ 中的 QT 和 C# 中的 WinForms。感谢您的贡献! 也许可以尝试 GTK+,因为您可以在 C 中使用它,或者在 Ruby gems 中获取包。不过这可能很棘手。许多更改和某些内容已被弃用,当您尝试将其更改为新建议时,您可能会迷失方向。它们只是提醒你的警告。他们仍然工作。 gtk.org

以上是关于什么是 Ruby Win32API 参数 |如何传递空指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中使用 Win32API 从 DLL 返回字符串

AHKpostmessage的使用方法/参数查询/win32API

创建可在另一种语言上调用的 win32api(dll) [关闭]

Win32API 常用消息

Win32API的小问题

postman中对于c#中out类型参数如何传参?