gpt4 book ai didi

perl - 如何使用 Win32 :API? 传递指向 DLL 的指针

转载 作者:行者123 更新时间:2023-12-04 07:11:00 25 4
gpt4 key购买 nike

我正在尝试传递 3 个指向 DLL 函数的指针。我有:

{

$代码=1;
$len=100;
$str=""x $len;

$function = new Win32::API(DLLNAME,'dllfunction','PPP','V');

$function->Call($code,$str,$len);

}

DLL 定义为 void dllfunction(int* a, char* str, int* len); DLL 将修改三个指针指向的所有变量。

但是,当我运行它时,我正在执行段错误。 Win32::API 的文档指定我应该使用实际变量名而不是 Perl 变量引用。谁能告诉我我错过了什么?谢谢。

*更多信息:

我加了 printf()在DLL中打印出三个指针的地址,以及printf在 Perl 中打印出三个变量的引用。我得到以下信息

DLL:代码 = 0x10107458 错误 = 0x10046b50 str = 0x10107460

Perl:代码 = 0x101311b8 错误 = 0x101312a8 str = 0x10131230

知道为什么 DLL 得到错误的地址吗?

****更多信息

经过多次调试,我发现从 DLL 函数返回时会发生这种情况。我添加了 printf("done\n");作为这个 DLL 函数的最后一行,这确实输出,然后程序段错误。我猜它发生在 Win32::API 中?有没有人经历过这个?

此外,我能够从 DLL 访问所有三个变量的初始变量。所以指针被正确传递,但由于某种原因,当从 DLL 返回时它会导致段错误。尝试将新数据复制到 Perl 变量时可能是段错误?

最佳答案

啊!!我想到了。

问题是这个

  1. And optionally you can specify the calling convention, this defaults to '__stdcall', alternatively you can specify '_cdecl'.


dll 函数是用 extern "C"__declspec(dllexport) 导出的,所以我想也许我应该使用 '_cdecl' 标志。

Win32::API('dll','dllfunction','PPP','V','_cdecl');

作品!

谢谢大家。

关于perl - 如何使用 Win32 :API? 传递指向 DLL 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/354050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com