2011-05-09 47 views
2

从一个c应用程序(VS2008,Win)中,我调用Borland的Delphi中编写的dll函数。该函数的工作原理,但每次调用后,我得到这个错误:“ESP的价值没有妥善保存在函数调用[...]”这意味着我的调用约定是错误的。我不知道Delphi和我没有完整的DLL的代码,但我相信这是德尔福功能:Win VS2008调用约定:来自c的Delphi dll

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

相反__stdcall的上面的c我试过__cdecl和__fastcall,但我总是得到ESP消息。另外,在Dephi函数代码中,该函数似乎返回char *,但是dll文件声明它返回“true”或“false”(?)。所以在c而不是“typedef char * ...”我试过“typedef BOOL ...”:仍然,我得到ESP消息。我知道我可以在“Basic Runtime Checks”(基本运行时检查)下抑制该消息(请参阅here),但我宁愿让调用语法正确。该DLL是用UPX压缩的,但我不确定它是否相关(就像我说的,该函数本身工作)。

+0

如果你不能得到代码,这将是棘手的!从DLL中返回一个'char *'函数似乎很奇怪。谁来负责释放这些记忆? – 2011-05-09 08:38:21

+0

我试过更合理的返回值,布尔也是。无论哪种情况,我都会收到ESP警告。 – MrSparkly 2011-05-09 22:29:04

+0

嗯...也许德尔福指针是4字节长,你的C指针是8字节长?你能编译32位吗? – pmg 2011-05-09 23:17:36

回答

0

我相信问题在于你的Delphi函数描述不正确。 你所能做的只是用__stdcall标记'翻译'功能。

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

但在你的情况下,我相信你完全知道你的Delphi DLL从哪里加载。所以我认为这只是该DLL特定版本的不正确文档。

0

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