【发布时间】:2013-01-05 05:09:42
【问题描述】:
问题:
我想在我的 Ruby 程序中使用一种用 C 编码并通过 DLL 公开的算法。
我想将该算法视为一个可以在 Ruby 中调用的黑盒——只需传入所需的参数并使用结果即可。
Ruby(1.8.7 和 1.9.3)具有 Win32API 模块,该模块似乎旨在让与动态库的接口变得非常容易,从而完全符合我的要求。
但问题是我似乎无法让 Win32API 调用发回字符串。
详情:
第三方C函数是CodeGen()。它需要 6 个参数,包括一个源字符串、一个用作加密密钥的任意字符串,以及为简单起见,4 个数字参数、一个有符号整数、一个无符号长整数和两个无符号短字节。根据这些,CodeGen() 实现了一个黑盒算法来返回一个结果字符串。
CodeGen() 的 C 原型是:
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 中使用它?
- 还有别的吗?
任何见解将不胜感激!
【问题讨论】: