如何使用Win32 :: API调用Win32 DLL void **参数?

时间:2009-09-09 13:14:32

标签: windows perl

我有一个我想从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 **参数的单个示例。救命啊!

3 个答案:

答案 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页面也是必不可少的。