从C++调用delphi过程



我有一个用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编译的dll
  2. 仅限ANSI
  3. 我在C++端进行调试,异常就在对函数的调用上
  4. 调用DLL API的函数不会返回任何内容

根据您提供的少量信息,我最初的想法是,您已经将数组DeviceName声明为局部变量,因此它在堆栈上,然后在尝试返回时溢出堆栈,从而给您一个AV。

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

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

  • 你检查过Delphi版本中的可变大小吗?DLL是在Delphi版本和调用应用程序中编写的?如果他们认为Integerint的大小不同(32位和64位(,那么指针将是垃圾。

  • 你能进入调试器中的DLL吗?如果你能在进入例程时查看变量是如何分配的,该例程应该确定你是否传递了它所期望的。

  • 最后,你确定Delphi DLL真的能工作吗?(我以前也遇到过这种情况,你可以花几天时间做一些不是你问题的事情!(

最新更新