赢得VS2008调用约定:来自c的Delphi dll

时间:2011-05-09 08:22:42

标签: c windows delphi dll calling-convention

从c 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);

而不是上面的c中的__stdcall我尝试了__cdecl和__fastcall,但我总是得到ESP消息。此外,在Dephi函数代码中,函数似乎返回char *,但是dll doc说它返回“true”或“false”(?)。所以在c而不是“typedef char * ...”我试过“typedef BOOL ......”:我还是得到了ESP消息。我知道我可以在“基本运行时检查”(参见here)下禁止显示该消息,但我宁愿将调用语法设置为正确。 dll是用UPX压缩的,但我不确定它是否相关(就像我说的,函数本身有效)。

2 个答案:

答案 0 :(得分:0)

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

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

但在你的情况下,我相信你完全清楚你的Delphi DLL的加载位置。所以我认为这个DLL的特定版本只是不正确的文档。

答案 1 :(得分:0)

如果dll使用Borland fastcall(EAX, EDX, ECX)并且编译器使用Microsoft fastcall(EAX, EDX),则可能导致ESP寄存器快速失去同步。