在Perl通过C ++结构指针以任意的DLL的函数调用
-
13-09-2019 - |
题
我使用Win32 API ::调用在它接受一个C ++结构指针DLL导出一个arbitary功能。
struct PluginInfo {
int nStructSize;
int nType;
int nVersion;
int nIDCode;
char szName[ 64 ];
char szVendor[ 64 ];
int nCertificate;
int nMinAmiVersion;
};
由于我们需要使用“包”函数来构造的结构和需要将参数传递
my $name = " " x 64;
my $vendor = " " x 64;
my $pluginInfo = pack('IIIIC64C64II',0,0,0,0,$name,$vendor,0,0);
它不能正确构建的结构。结果, 这似乎应用到C将蚕食那些许多论点,长度参数。结果 可有一个人,请提出来构建这种结构形式Perl和passon到DLL调用的最佳方式。
提前,结果,由于 纳加基兰
解决方案
使用Z
(NUL填充字符串)在模板,如在
my $pluginInfo = pack('IIIIZ64Z64II',0,0,0,0,$name,$vendor,0,0);
另外,看看 Win32::API::Struct
,这是Win32 API ::模块的一部分。
其他提示
有关的任何复杂的,检查出转换::二进制中:C 。这似乎在第一望而生畏,但一旦你意识到它的力量,这是一个大开眼界。
更新:我想补充一点的信息。你需要看看在的的主要原因使用它的模块的手册页的特定部分。我会引用它的方便:
为什么要使用转换::二进制中:C?
请说出您想包(或解压缩)的数据 根据下面的C 结构:
struct foo {
char ary[3];
unsigned short baz;
int bar;
};
您当然可以使用Perl的包 和解压功能:
@ary = (1, 2, 3);
$baz = 40000;
$bar = -4711;
$binary = pack 'c3 Si', @ary, $baz, $bar;
但是,这意味着,该结构 成员字节对齐。如果他们 长排列(这是默认 大多数编译器),你必须写
$binary = pack 'c3 x S x2 i', @ary, $baz, $bar;
不真正增加 可读性。
现在想象一下,你需要包装 对于一个完全不同的数据 建筑具有不同字节 订购。你将调查组 手册页再次,也许拿出 这样:
$binary = pack 'c3 x n x2 N', @ary, $baz, $bar;
然而,如果你试图解开$ FOO 再次,您签署的价值已经转向 成无符号的。
所有这仍然可以与被管理 Perl的。但是想象一下你的结构得到 更复杂?想象一下,你需要 支持不同的平台?想像 您需要更改 结构?你不仅要 改变C源也不过几十 包中的字串Perl代码。这个 毫无乐趣。和perl应该很有趣。
现在,是不是如果你能成为伟大 刚刚看了你以前做的C源代码 已经写好并使用所有类型 包装定义那里 拆包?那是什么 转换::二进制中:C一样。