如何在 Ruby 中使用 Win32API 从 DLL 返回字符串
Posted
技术标签:
【中文标题】如何在 Ruby 中使用 Win32API 从 DLL 返回字符串【英文标题】:How do I return a string from a DLL using Win32API in Ruby 【发布时间】:2012-12-02 15:13:05 【问题描述】:目前我只能在 Ruby 中使用 win32api,所以没有 ffi 等。在 Ruby 中,我正在加载一个 DLL 并传递一个字符串,我期望返回相同的字符串。 代码如下:
Ruby 代码
string = "hello"
p = Win32API.new('C:/func/testFunc', 'Print', ['P'], 'S')
p.call(string)
输出
=> 7476721
DLL
extern (C)export char* Print(char* am)
return am;
我得到的是数字而不是“你好”。我猜这是我刚刚传递给 dll 的值的地址。有人可以告诉我从 DLL 中检索字符串的正确方法是什么。
【问题讨论】:
好问题——我也遇到了同样的问题...你在这个问题上运气好吗? 【参考方案1】:这不是我在红宝石方面的专长,但我发现这个问题很有趣。 Win32API 采用和返回(通常)指针作为数据类型。这意味着您应该传递变量指针,DLL 将编辑指针。您可以根据需要对它们进行打包和解包(Win32API 规范很糟糕这一事实没有帮助)。这里有一些很好的例子:
http://www.rubytips.org/2008/05/13/accessing-windows-api-from-ruby-using-win32api-library/
我认为没有“S”的返回(导出)类型。唯一有效的选项是 n、l、i 和 p。在此处查看此文档:http://www.ruby-doc.org/docs/ProgrammingRuby/html/lib_windows.html
【讨论】:
以上是关于如何在 Ruby 中使用 Win32API 从 DLL 返回字符串的主要内容,如果未能解决你的问题,请参考以下文章
VC++ win32 API 编程:如何将图像从剪贴板中取出并显示在窗口中?