【发布时间】:2021-07-15 00:57:21
【问题描述】:
我有一个用 Delphi 编写的 DLL,我需要从 C++ 代码中调用它。 Delphi中程序的签名是:
procedure GetDeviceName( No: integer;
Name: PChar;
Len: integer;
var Error: integer); stdcall;
从 DLL 的代码中,我相信我可以用这段代码来调用它:
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 的导出符号,并且考虑的过程已正确导出。我的程序出了什么问题?
更多关于环境的信息:
- 这是一个用 delphi 6 编译的 dll。
- 仅限 ANSI。
- 我在 C++ 端调试,异常就在函数调用上。
- 调用 DLL API 的函数没有返回任何内容。
【问题讨论】:
-
对我来说第一个明显的测试是提供一个足够大的数组(256 字节),但只告诉 128(甚至只有 64)作为长度参数,然后查看写入它的内容。
-
显示的代码对我来说看起来不错。 AccessViolation 错误消息实际上逐字逐句地说了什么?您是否确认
GetProcAddress()没有返回NULL指针? DLL 中的代码是什么样的?请编辑您的问题以提供更多详细信息。 -
您可以使用 Delphi 调试您的 DLL: 在 DLL 项目中,将“主机应用程序”设置为您的 C++ 应用程序。在你的函数中放置一个断点并运行。 Delphi 将加载 C++ 应用程序,然后再加载 DLL。然后 Delphi 调试器将在 DLL 中的断点处停止,从那里您可以单步执行 Delphi 代码以了解问题所在。