如何使用“&”参数调用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);
...
我正在为 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);
...