2

从ac app(VS2008,Win),我在Borland用Delphi编写的dll中调用一个函数。该函数有效,但在每次调用后我都会收到此错误:“ESP 的值没有在函数调用中正确保存[…]”,这意味着我的调用约定是错误的。我不了解 Delphi,也没有完整的 dll 代码,但我相信这是 Delphi 功能:

function translate(file1, file2: PChar):PChar; stdcall;
    ...
    Result:=PChar(c);
end;
exports
    translate; 

c中的相关部分:

typedef char*(__stdcall *translate)(char*, char*);
translate MyTranslate;
...
MyTranslate = (translate)GetProcAddress(dll, "translate");
char* result = (*MyTranslate)(file1, file2);

我尝试了 __cdecl 和 __fastcall,而不是上面 c 中的 __stdcall,但我总是收到 ESP 消息。此外,在 Dephi 函数代码中,该函数似乎返回 char*,但 dll 文档说它返回“true”或“false”(?)。因此,在 c 而不是“typedef char * ...”中,我尝试了“typedef BOOL ...”:仍然,我收到了 ESP 消息。我知道我可以在“基本运行时检查”(参见此处)下隐藏消息,但我宁愿正确调用语法。dll 是用 UPX 压缩的,但我不确定它是否相关(就像我说的,函数本身可以工作)。

4

2 回答 2

0

我认为问题在于您的 Delphi 函数描述不正确。您所能做的就是用 __stdcall 正确标记“翻译”功能。

当您尝试根据一个描述调用 COM 对象并且它实际上有一个不同的描述时,就会发生这种错误。使用 COM 对象会发生这种情况,因为您的机器上可能有多个版本的 COM 对象,并且加载了不正确的版本。所以,这是一个类似于 dll 的问题。

但在你的情况下,我相信你非常清楚你的 Delphi DLL 是从哪里加载的。所以我认为对于那个特定版本的 DLL 来说,这只是不正确的文档。

于 2011-06-16T11:58:03.580 回答
0

如果 dll 使用 Borlandfastcall(EAX, EDX, ECX)而编译器使用 Microsoft fastcall(EAX, EDX),那可能会导致 ESP 寄存器快速失去同步。

于 2011-07-18T10:24:03.683 回答