如何使用“&”调用DLL函数参数?

时间:2015-03-31 13:36:35

标签: perl winapi

我正在为perl使用Win32 :: API,我试图在我的头文件中调用一个声明如下的函数:

void __stdcall GetStepMotorHomeStatus(bool &xhome,bool &yhome,bool &zhome,bool &rhome);

如果按原样导入:

Win32::API->Import('CSCInterface.dll', 'void __stdcall GetStepMotorHomeStatus(BOOL &xhome,BOOL &yhome,BOOL &zhome,BOOL &rhome);');

我收到错误:" Win32 :: API :: parse_prototype:bad prototype"

如何导入并传递参数?

由于

2 个答案:

答案 0 :(得分:3)

引用实际上只是编译器不允许您更改的指针。将指针传递给足够大的内存以容纳bool


Win32 :: API的指针魔法在我之前遇到过。我完全避免它,除非我传递LPCSTR

所需的步骤是:

  • 分配足够的内存。
  • 如果需要,请将其初始化。
  • 获取指向该内存块的指针。
  • 告诉Win32 :: API库希望LONG按原样传递指针。

# Value to pass in.
my $xhome = 0;

# Allocate (and initialize) memory.
my $packed_xhome = pack('C', $xhome);

# Pointer to the string buffer of $packed_home as a number.
my $packed_xhome_ptr = unpack('L', pack('P', $packed_xhome));

您可以使用以下内容验证指针是否正确:

use Devel::Peek qw( Dump );
Dump($packed_xhome);                  # PV = 0x1239de0 "\0"\0
printf("0x%x\n", $packed_xhome_ptr);  # 0x1239de0

调用该函数后,您可以使用以下命令获取修改后的值。

my $xhome = unpack('C', $packed_xhome);

答案 1 :(得分:0)

我的工作代码与@ ikegami的答案实际上有点不同。我改变了'&'导入中的'*'并立即解压缩变量:

Win32::API->Import('CSCInterface.dll', 'void __stdcall GetStepMotorHomeStatus(BOOL *xhome,BOOL *yhome,BOOL *zhome,BOOL *rhome);');


my $xhome = 0;
...
GetStepMotorHomeStatus($xhome,$yhome,$zhome,$rhome);

$xhome = unpack('C', $xhome);
...