将C ++ dll导出到Delphi程序

时间:2012-10-26 07:51:57

标签: c++ delphi dll

我有一个带导出功能的dll

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

如果你不能修改Delphi代码,那么你需要使你的C ++ DLL匹配。通过使用.def文件来执行此操作,该文件允许您控制导出的名称。


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

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

同样,如果您无法修改Delphi代码,则需要使C ++代码匹配。 Delphi接口返回值实现为additional var parameter following the other parameters。因此,为了使您的C ++函数匹配,请将其声明为:

void __stdcall GetDriver(IDriver* &retVal);