从一个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压缩的,但我不确定它是否相关(就像我说的,该函数本身工作)。
如果你不能得到代码,这将是棘手的!从DLL中返回一个'char *'函数似乎很奇怪。谁来负责释放这些记忆? – 2011-05-09 08:38:21
我试过更合理的返回值,布尔也是。无论哪种情况,我都会收到ESP警告。 – MrSparkly 2011-05-09 22:29:04
嗯...也许德尔福指针是4字节长,你的C指针是8字节长?你能编译32位吗? – pmg 2011-05-09 23:17:36