0

我有一个带导出功能的 dll

extern "C" __declspec(dllexport) IDriver * __stdcall GetDriver() 

有一个用 Delphi 编写的程序。它看不到函数GetDriver()。这是双重可怕的,因为我无法获取和修改该程序的来源。

成功加载我的 dll(根据日志文件)和调用导出功能失败的原因可能是什么?谢谢你。

Window 7 x64,Visual Studio 2010,用于 x86 目标的 C++ 项目

4

1 回答 1

4

最可能的解释是该函数将使用修饰名称导出。我希望它以 name 导出GetDriver@0。所以你可以像这样导入它:

function GetDriver: IDriver; stdcall; external 'DllName.dll' name 'GetDriver@0';

使用Dependency Walker之类的工具来检查用于导出函数的确切名称。

如果您不能修改 Delphi 代码,那么您需要使您的 C++ DLL 匹配。通过使用允许您控制导出名称的 .def 文件来做到这一点。


您将面临的另一个问题是 Delphi 的返回值 ABI 与 Windows 平台上大多数其他工具使用的不同。具体来说,返回值在语义上是一个var参数。另一方面,您的 C++ 编译器会将返回值视为out参数。我关于DelphiWideString返回值的问题正好涵盖了这个问题。

因此,我希望上面的函数声明会导致访问冲突。相反,您应该将返回值声明为 aPointer并将其转换为 Delphi 代码中的接口引用。您需要仔细检查并确保正确处理引用计数。

同样,如果不能修改 Delphi 代码,则需要使 C++ 代码匹配。Delphi 接口返回值是作为其他var参数之后的附加参数实现的。因此,要使您的 C++ 函数匹配,请像这样声明它:

void __stdcall GetDriver(IDriver* &retVal);
于 2012-10-26T07:57:26.600 回答