我正在为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" 。
如何导入并传递参数?
由于
答案 0 :(得分:3)
引用实际上只是编译器不允许您更改的指针。将指针传递给足够大的内存以容纳bool
。
Win32 :: API的指针魔法在我之前遇到过。我完全避免它,除非我传递LPCSTR
。
所需的步骤是:
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);
...