gpt4 book ai didi

c - Win VS2008 调用约定 : Delphi dll from c

转载 作者:可可西里 更新时间:2023-11-01 10:50:24 26 4
gpt4 key购买 nike

我在 C 应用程序(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 消息。我知道我可以抑制“基本运行时检查”下的消息(请参阅 here ),但我宁愿获得正确的调用语法。该 dll 使用 UPX 压缩,但我不确定它是否相关(就像我说的,该函数本身有效)。

最佳答案

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

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

但是对于您的情况,我相信您非常清楚从何处加载 Delphi DLL。所以我认为它只是该特定版本 DLL 的不正确文档。

关于c - Win VS2008 调用约定 : Delphi dll from c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com