我有一个带导出功能的dll
extern "C" __declspec(dllexport) IDriver * __stdcall GetDriver()
有一个在Delphi上编写的程序。它无法看到函数GetDriver()。 这是双重可怕的,因为我无法获取和修改此程序的来源。
成功加载我的dll(根据日志文件)和失败的呼叫导出功能可能是什么原因?谢谢。
Window 7 x64,Visual Studio 2010,x86目标的C ++项目
答案 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);