从C+调用delphi过程+; 我在Delphi中写了一个DLL,我需要从C++代码中调用它。Delphi中程序的签名为: procedure GetDeviceName( No: integer; Name: PChar; Len: integer; var Error: integer); stdcall;
根据DLL中的代码,我相信我可以用以下代码块调用它:从C+调用delphi过程+; 我在Delphi中写了一个DLL,我需要从C++代码中调用它。Delphi中程序的签名为: procedure GetDeviceName( No: integer; Name: PChar; Len: integer; var Error: integer); stdcall;,c++,delphi,C++,Delphi,根据DLL中的代码,我相信我可以用以下代码块调用它: typedef void (__stdcall *GetDeviceNamePtr)(int, char*, int, int*); GetDeviceNamePtr GetDeviceName = (GetDeviceNamePtr) GetProcAddress(m, "GetDeviceName"); char DeviceName[256]; int Error; GetDeviceName(1, Device
typedef void (__stdcall *GetDeviceNamePtr)(int, char*, int, int*);
GetDeviceNamePtr GetDeviceName = (GetDeviceNamePtr) GetProcAddress(m, "GetDeviceName");
char DeviceName[256];
int Error;
GetDeviceName(1, DeviceName, 256, &Error);
但是,我有一个访问权限冲突。过程签名的最后一个参数是指向整数还是整数的指针?我对过程声明中的“var”关键字感到困惑。我已经检查了DLL的导出符号,所考虑的过程已正确导出。我的程序出了什么问题
有关环境的更多信息:
从您提供的相当少的信息来看,我最初的想法是您已将数组
DeviceName
声明为局部变量,因此它位于堆栈上,然后在尝试返回时溢出堆栈并提供AV
- 在Delphi的现代版本中,
是Char
,wchar\t
是PChar
(因此256的wchar\t*
可能意味着256个字节或128个字符)Len
- 原型中的
表示通过引用传递的参数,因此我希望var
int*
- 您是否检查了Delphi版本中写入DLL的变量大小以及调用应用程序?如果他们认为
和Integer
大小不同(32位与64位),那么指针将是垃圾int
- 您能在调试器中单步进入DLL吗?如果您可以在进入例程时查看变量是如何分配的,该例程应确定您是否传递了它期望的内容
- 最后想一想,你确定Delphi DLL真的能工作吗?(我以前就被这件事弄得不知所措,你可以花上几天的时间做一些不是你的问题的事情!)
DeviceName
声明为局部变量,因此它位于堆栈上,然后在尝试返回时溢出堆栈并提供AV
- 在Delphi的现代版本中,
是Char
,wchar\t
是PChar
(因此256的wchar\t*
可能意味着256个字节或128个字符)Len
- 原型中的
表示通过引用传递的参数,因此我希望var
int*
- 您是否检查了Delphi版本中写入DLL的变量大小以及调用应用程序?如果他们认为
和Integer
大小不同(32位与64位),那么指针将是垃圾int
- 您能在调试器中单步进入DLL吗?如果您可以在进入例程时查看变量是如何分配的,该例程应确定您是否传递了它期望的内容
- 最后想一想,你确定Delphi DLL真的能工作吗?(我以前就被这件事弄得不知所措,你可以花上几天的时间做一些不是你的问题的事情!)
GetProcAddress()
没有返回NULL
指针?DLL中的代码是什么样子的?请编辑您的问题以提供更多的细节。您可以用Delphi调试DLL:在DLL项目中,将“宿主应用程序”设置为C++应用程序。在函数中设置断点并运行。Delphi将加载加载DLL的C++应用程序。然后Delphi调试器将在DLL中的断点处停止,从那里您可以单步执行Delphi代码以了解错误所在。对我来说,第一个明显的测试是提供一个足够大的数组(256字节),但只告诉128(甚至仅64字节)作为长度参数,然后查看写入该数组的内容。显示的代码在我看来还行。AccessViolation错误消息实际上说的是什么,逐字逐句?您是否验证了GetProcAddress()
没有返回NULL
指针?DLL中的代码是什么样子的?请编辑您的问题以提供更多的细节。您可以用Delphi调试DLL:在DLL项目中,将“宿主应用程序”设置为C++应用程序。在函数中设置断点并运行。Delphi将加载加载DLL的C++应用程序。然后,Delphi调试器将在DLL上的断点上停止,从那里您可以在Delphi代码中单步执行,了解错误。技术上,int*Error
也会起作用(这是C需要使用的)。但是无论如何,Delphi和C++都使用了32位的大小为<代码>整数< /代码> /<代码> int >代码>,在增加缓冲区大小时,也得到了同样的例外。我希望在您回答的最后一点附近出现问题:@rbw那么问题必须在DLL本身内部,但您尚未显示该代码。请编辑您的问题,添加。技术上,int*Error
也会起作用(这是C需要使用的)。但是无论如何,Delphi和C++都使用了32位的大小为<代码>整数< /代码> /<代码> int >代码>,在增加缓冲区大小时,也得到了同样的例外。我希望成为一名职业选手