将C DLL导出到Delphi程序

exporting C++ dll to Delphi program

本文关键字:Delphi 程序 DLL      更新时间:2023-10-16

我有一个带有导出函数的dll

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

有一个在Delphi上写的程序。它看不到函数getDriver()。这是双倍可怕的,因为我无法获得并修改此程序的来源。

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

窗口7 x64,Visual Studio 2010,X86 Target的C 项目

最有可能的解释是该函数将以装饰的名称导出。我希望它会以GetDriver@0的名称导出。因此您可以这样导入:

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

使用依赖关系沃克之类的工具检查用于导出功能的确切名称。

如果您无法修改Delphi代码,则需要使C DLL匹配。通过使用一个.def文件来执行此操作,该文件允许您控制导出的名称。


您将面临的另一个问题是,Delphi的ABI返回值与Windows平台上大多数其他工具使用的ABI不同。具体而言,返回值在语义上是var参数。另一方面,您的C 编译器将将返回值视为out参数。我在Delphi WideString返回值的问题涵盖了此问题。

因此,我希望上面的功能声明会导致违规行为。相反,您应该将返回值声明为Pointer,并将其施放为Delphi代码中的接口参考。您需要仔细检查并确保适当处理参考计数。

再次,如果您无法修改Delphi代码,则需要使C 代码匹配。Delphi接口返回值被实现为遵循其他参数的附加var参数。因此,要使您的C 功能匹配,请这样声明:

void __stdcall GetDriver(IDriver* &retVal);