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

How to call DLL function using "&" parameter?

我正在为 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"

如何导入和传递参数?

谢谢

引用实际上只是编译器不允许您更改的指针。将指针传递给足以容纳 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 "[=11=]"[=11=]
printf("0x%x\n", $packed_xhome_ptr);  # 0x1239de0

调用函数后,您可以使用以下方法获取修改后的值。

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

我的工作代码实际上与@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);
...