用Ruby';s Win32API.new,isn';t';L';与'相同;我';,那么';N';或';P';?

用Ruby';s Win32API.new,isn';t';L';与'相同;我';,那么';N';或';P';?,ruby,winapi,Ruby,Winapi,在一些文档中,Ruby的Win32API有'L'和'N'来指定一个“数字”。。。在一些文档中,'L'是“long”。'N'是否已弃用,而'L'是否实际上与'I'相同?“数字”有点不那么具体 在 没有将布尔参数指定为'B'或'I',只有返回值 在 有 Win32API.new('kernel32.dll', 'FormatMessageA', 'LPLLPLP', 'L') 而不是更常见的['L','p','L',…]格式 hWnd是'L',因此'I'也会工作吗?(hWnd是窗口的句柄)

在一些文档中,Ruby的Win32API有
'L'
'N'
来指定一个“数字”。。。在一些文档中,
'L'
是“long”。
'N'
是否已弃用,而
'L'
是否实际上与
'I'
相同?“数字”有点不那么具体

没有将布尔参数指定为
'B'
'I'
,只有返回值

 Win32API.new('kernel32.dll', 'FormatMessageA', 'LPLLPLP', 'L')
而不是更常见的
['L','p','L',…]格式

hWnd
'L'
,因此
'I'
也会工作吗?(
hWnd
是窗口的句柄)

布尔参数是
'B'
,与
'I'
相同

所以基本上,我们可以使用大多数东西作为
'I'
?即使是
'P'
也应该是4字节,那么
'I'
也应该工作吗?是否有更正式的规范


更新:现在我想了更多关于
'p'
,它实际上将使用Ruby的String类对象,并获取内容缓冲区部分并将其传递到C函数中。所以使用
'I'
可能不会触发这种行为。(示例:例如使用
GetWindowText()

L可以与I相同-但由于I存在,我会假设它表示“short”(C标准没有指定“整数”的长度)。 P可以与L相同——至少如果您使用的是32位ruby


Win32Api真的很难看,我建议不要使用它。您可以查看和or。

我正在查看源代码,“L”和“I”之间的唯一区别似乎是“L”调用
rb_num2; ulong
中的“I”调用
rb_num2; int
。因此,我想唯一的区别在于是否将其视为有符号值P'也是结果,但它遵循额外的逻辑,所以我可能会坚持文档中的建议。在最新版本的win32 api(1.4.5)中,我找不到任何提到“N”的地方,因此它可能已被弃用。Windows API不返回
boolean
,但有些API返回
BOOL
,这是一个
int
(令人惊讶!)。简言之,我认为你不应该在所有事情上都使用“我”。据我所见,win32 api文档非常少。至少可以浏览源代码。

Ruby 1.9版的PickAx手册也建议使用
DL
,但我尝试了
gem安装DL
,但它不存在。
DL
应该包含在Ruby中-try
需要DL
。但是
dl
的文档更糟糕。我还在win32 api zip文件中的自述文件中看到:
删除了“N”和“N”原型。现在请始终使用“L”表示长。