将C DLL导出到Delphi程序
exporting C++ dll to Delphi program
我有一个带有导出函数的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);
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- DLL函数导出一个指针做Delphi程序
- 将C DLL导出到Delphi程序
- 如何将DLL注入Delphi程序
- 将数据从Delphi DLL传递到C++应用程序中
- 将二进制数据从Qt/C++DLL传递到Delphi主机应用程序中
- 从 c++ dll 返回 double* 到 delphi 程序
- 使用消息处理程序将 c++ dll 调用转换为 delphi
- MFC应用程序中Delphi 7和Delphi XE4之间的ActiveX差异
- 从C++DLL中调用Delphi应用程序
- 在Delphi应用程序中使用c++ DLL回调函数
- 在Delphi应用程序中调用C++DLL
- Delphi与C++Builder之比较——对于做Win32的Java程序员来说,这是更好的选择