从 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 的导出符号,所考虑的过程已正确导出。我的程序有什么问题?

关于环境的更多信息:

  1. 是用delphi6.
  2. 编译的dll
  3. 仅限 ANSI。
  4. 我在 C++ 端调试,异常就在函数调用上。
  5. 调用 DLL 的函数未返回任何内容 API。

从你提供的相当少量的信息来看,我最初的想法是你已经将数组 DeviceName 声明为局部变量所以它在堆栈上,然后溢出堆栈给你一个 AV当你尝试 return.

  • 在 Delphi 的现代版本中,Charwchar_tPCharwchar_t*(所以 Len 的 256 可能意味着 256 个字节或 128 个字符)。

  • 原型中的
  • var 表示通过引用传递的参数,所以我希望 int*.

  • 您是否检查过 Delphi 版本中写入 DLL 和调用应用程序的变量大小?如果他们认为 Integerint 大小不同(32 位与 64 位),您的指针将是垃圾。

  • 您能在调试器中单步执行 DLL 吗?如果您可以在进入例程时查看变量是如何分配的,那么应该可以确定您是否传递了它所期望的内容。

  • 最后一个想法 - 您确定 Delphi DLL 确实有效吗? (我以前也被这个问题困扰过,你可以花几天时间做一些与你无关的事情!)