我有一个我想从Perl调用的Windows DLL。导出函数的原型是:
int __stdcall func(const char*, int, int, int, double, double, void**);
最后一个参数返回指向函数中分配的对象的指针。
perl代码 -
my $dll_path = "../stage/test_dll.dll";
my $dll_func = new Win32::API($dll_path,
'func',
'PIIIDDP', 'I');
my $data = "test something here";
my $pResult = 0;
my $rc = $ dll_func ->Call($data, 0, 0, 9, 0.6, 0.3, $pResult);
弹出一条错误消息,指出无法写入内存。也许我不能用P代表void **?我阅读了所有文档,找不到使用void **参数的单个示例。救命啊!
答案 0 :(得分:2)
与P
参数关联的变量必须是预先分配的字符串变量,而不是整数。尝试类似:
my $pResult = "\0" x 8; # Just in case we're 64-bit
my $rc = $ dll_func ->Call($data, 0, 0, 9, 0.6, 0.3, $pResult);
然后 $pResult
将包含指向该对象的指针。您可能需要使用unpack
来提取它。
您没有说出对象需要做什么。如果您需要将其作为void*
传递给其他DLL函数,则可能需要将其解压缩为long
并在参数中使用N
而不是P
列表。
答案 1 :(得分:0)
看看swig将如何做到这一点。也许你会在那里找到答案。
答案 2 :(得分:0)
这个答案可能不合适,但Inline::C
模块提供了一个非常好的用户库界面,在Perl和C中你可以提出各种变通方法来通过{{1}传递数据}指针。
void**
如果Inline :: C看起来很有趣,那么CPAN上的Inline :: C-Cookbook页面也是必不可少的。