从 C++ 调用 delphi 过程
Calling delphi procedure from C++
我有一个用 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 的导出符号,所考虑的过程已正确导出。我的程序有什么问题?
关于环境的更多信息:
- 是用delphi6.
编译的dll
- 仅限 ANSI。
- 我在 C++ 端调试,异常就在函数调用上。
- 调用 DLL 的函数未返回任何内容 API。
从你提供的相当少量的信息来看,我最初的想法是你已经将数组 DeviceName
声明为局部变量所以它在堆栈上,然后溢出堆栈给你一个 AV当你尝试 return.
在 Delphi 的现代版本中,Char
是 wchar_t
而 PChar
是 wchar_t*
(所以 Len
的 256 可能意味着 256 个字节或 128 个字符)。
原型中的 var
表示通过引用传递的参数,所以我希望 int*
.
您是否检查过 Delphi 版本中写入 DLL 和调用应用程序的变量大小?如果他们认为 Integer
和 int
大小不同(32 位与 64 位),您的指针将是垃圾。
您能在调试器中单步执行 DLL 吗?如果您可以在进入例程时查看变量是如何分配的,那么应该可以确定您是否传递了它所期望的内容。
最后一个想法 - 您确定 Delphi DLL 确实有效吗? (我以前也被这个问题困扰过,你可以花几天时间做一些与你无关的事情!)
我有一个用 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 的导出符号,所考虑的过程已正确导出。我的程序有什么问题?
关于环境的更多信息:
- 是用delphi6. 编译的dll
- 仅限 ANSI。
- 我在 C++ 端调试,异常就在函数调用上。
- 调用 DLL 的函数未返回任何内容 API。
从你提供的相当少量的信息来看,我最初的想法是你已经将数组 DeviceName
声明为局部变量所以它在堆栈上,然后溢出堆栈给你一个 AV当你尝试 return.
在 Delphi 的现代版本中,
Char
是wchar_t
而PChar
是wchar_t*
(所以Len
的 256 可能意味着 256 个字节或 128 个字符)。
原型中的 var
表示通过引用传递的参数,所以我希望int*
.您是否检查过 Delphi 版本中写入 DLL 和调用应用程序的变量大小?如果他们认为
Integer
和int
大小不同(32 位与 64 位),您的指针将是垃圾。您能在调试器中单步执行 DLL 吗?如果您可以在进入例程时查看变量是如何分配的,那么应该可以确定您是否传递了它所期望的内容。
最后一个想法 - 您确定 Delphi DLL 确实有效吗? (我以前也被这个问题困扰过,你可以花几天时间做一些与你无关的事情!)