如何在 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 返回字符串的主要内容,如果未能解决你的问题,请参考以下文章

与导出和返回值相关的 ruby​​ win32api 问题

如何从 Win32 API 中的总线关系中获取设备实例路径

如何从 PHP 进行 Win32 API 调用?

VC++ win32 API 编程:如何将图像从剪贴板中取出并显示在窗口中?

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

在 Win32API 中注册一个窗口类