我使用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一样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top