gpt4 book ai didi

从 Ruby 中调用 C 代码——如何使用返回的指针?

转载 作者:可可西里 更新时间:2023-11-01 13:26:38 26 4
gpt4 key购买 nike

问题:

我想在我的 Ruby 程序中使用一种用 C 编码并通过 DLL 公开的算法。

我想将该算法视为一个黑盒,我可以从 Ruby 中调用它——只需传入所需的参数并使用结果即可。

Ruby(1.8.7 和 1.9.3)都有 Win32API 模块,它似乎旨在使与动态库的接口(interface)变得非常容易,以完成我想要的事情。

但问题是我似乎无法调用 Win32API 来发回字符串。

详细信息:

第三方C函数是CodeGen()。它有 6 个参数,包括一个源字符串、一个用作加密 key 的任意字符串,以及为简单起见的 4 个数值参数,一个 signed int、一个 unsigned long 和两个 unsigned short。根据这些,CodeGen() 实现黑盒算法以返回结果字符串。

CodeGen() 的 C 原型(prototype)是:

const char *CodeGen(  int encryp_level, 
const char *source_str, const char *encryp_key,
unsigned long param_a,
unsigned short param_b, unsigned short param_c
)

请注意,两个输入字符串都是常量,即它们作为字符串提供给 CodeGen()——因此指向常量字符串的指针

CodeGen() 的返回值也是一个字符串,具有固定的最大长度,因此它将返回一个指针。

我的问题:

如何设置对 CodeGen() 的调用并取回它应该生成的字符串?

我的尝试:

当我期望获得一个字符串时,下面的代码只是简单地将整数作为返回值。

require 'Win32API'

codeGen = Win32API.new("encrypt.dll", "CodeGen", "ISSIII", "S")

ret_str = codeGen.Call(3, "foo", "bar", 0, 0, 0)

puts ret_str

但是,我得到的不是一个字符串,而是一个整数。 编辑:这会是一个指针吗?

虽然我在 Windows 7 64 位版本上使用 Ruby 1.9.3,但我还在 Windows XP 32 位上使用 Ruby 1.8.7 测试了上述内容,所以我很确定它是与我使用 Win32API 本身有关。

不确定问题是否出在以下任何一个:

  • 整数 (3, 0, ...) 需要打包吗?
  • 我需要区分短型和长型吗?
  • 我是否没有正确处理返回值?
  • 如果返回值是一个指针,我该如何在 Ruby 中使用它?
  • 还有别的吗?

任何见解将不胜感激!

最佳答案

虽然我不知道为什么 Win32API 方法不起作用,但我找到了一个更简单的解决方案,使用 FFI 来解决从 Ruby 中调用 C 函数的问题或与 DLL 接口(interface)。


使用FFI的解决方案

在 Ruby 中使用 FFI 与 DLL 接口(interface),如下所示:

  • (1) 安装 ffi (适用于 ruby​​ 1.9.3,ymmv 适用于以前的版本)

    gem 安装 ffi

  • (2) 创建自己的 Ruby 模块来包装 C 函数

require 'ffi'

module CodeGen # Ruby wrapper (your choice)
extend FFI::Library
ffi_lib 'codegen' # DLL name (given)
attach_function
:create_code, # method name (your choice)
:CreateCodeShort3, # DLL function name (given)
[ :int, :string, :string, :uint, :ushort, :ushort], :string
# specify C param / return value types
end

ret_str = CodeGen.create_code(3, "foo", "bar", 0,0,0)

puts ret_str
  • (3) 运行。结果根据需要给出一个字符串。

完成!

关于从 Ruby 中调用 C 代码——如何使用返回的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com