我有一个用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。
-
在Delphi的现代版本中,
Char
是wchar_t
,PChar
是wchar_t*
(因此256的Len
可能意味着256字节或128个字符(。 -
原型中的
var
表示通过引用传递的参数,所以我期望int*
。 -
你检查过Delphi版本中的可变大小吗?DLL是在Delphi版本和调用应用程序中编写的?如果他们认为
Integer
和int
的大小不同(32位和64位(,那么指针将是垃圾。 -
你能进入调试器中的DLL吗?如果你能在进入例程时查看变量是如何分配的,该例程应该确定你是否传递了它所期望的。
-
最后,你确定Delphi DLL真的能工作吗?(我以前也遇到过这种情况,你可以花几天时间做一些不是你问题的事情!(