如何将C++头文件转换为delphi
Posted
技术标签:
【中文标题】如何将C++头文件转换为delphi【英文标题】:How to convert C++ header file to delphi 【发布时间】:2015-08-25 05:38:30 【问题描述】:我正在将 C++ 标头转换为 delphi pas 文件。首先,我使用 Dr.Bob 模块中的 HeadConv 4.0 转换了 C++ 头文件。但它编译失败。 任何人都可以帮助进行这种转换吗?
****** C++ 头文件 ******
#if !defined(____KKK_Module__)
#define ____KKK_Module__
#ifdef KKK_MODULE_EXPORTS
#define KKK_MODULE_API extern "C" __declspec(dllexport)
#else
#define KKK_MODULE_API extern "C" __declspec(dllimport)
#endif
KKK_MODULE_API int _stdcall KKK_Creat();
......
以上代码是Delphi代码转换后导致的错误如下;
******德尔福代码******
$IFDEF KKK_MODULE_EXPORTS
const
KKK_MODULE_API = extern 'C' __declspec(dllexport); **//error**
$ELSE
const
KKK_MODULE_API = extern 'C' __declspec(dllimport); **//error**
$ENDIF
var
KKK_Creat: function: KKK_MODULE_API INT cdecl $IFDEF WIN32 stdcall
$ENDIF;
.........
错误原因是'extern' 不是Delphi 的保留语法。 我不知道如何用 Delphi 代码替换它,需要任何帮助。
【问题讨论】:
没有 C# 头文件之类的东西。你的意思是C++头文件。见***.com/questions/100596/…function KKK_Creat: Integer; stdcall; external 'TheLibrary.dll' name 'KKK_Creat';
HeadConv 完全坏了。使用h2p
。
我的建议,我已经做了很多标题转换:不要使用自动转换工具。他们中的大多数会为某些标头生成错误或无用的代码。我更喜欢手动转换,借助 my Conversion Pack 和 IDE 的一些 macr 记录工具。这工作得很好,并且可以快速产生坚如磐石的翻译尝试阅读我关于这个的文章(Pitfalls of converting)。
【参考方案1】:
那不是 C#,是 C++。
条件部分是一种非常常见的模式,它允许在构建库和导入库时都使用头文件。您只是在导入,因此不需要翻译该部分。
然后你就只剩下一个函数了:
extern "C" __declspec(dllimport) int _stdcall KKK_Creat();
extern "C"
的使用抑制了 C++ 名称修改。你不翻译那个。
简单地说,您可以使用 external
指令翻译 __declspec(dllimport)
。
全部翻译成:
function KKK_Creat: Integer; stdcall; external libname;
其中libname
是一个包含DLL 名称的字符串。
您需要检查用于导出函数的名称。如果库是在没有 .def 文件的情况下构建的,则函数名称将被修饰。该函数将命名为KKK_Creat@0
。使用 dumpbin 或 Dependency Viewer 等工具检查 DLL 中导出的函数名称。
FWIW,我从未找到有效的通用标题翻译器,并且始终发现最好手动执行此操作,或者编写定制的标题特定翻译器。
【讨论】:
FWIW,如果库是用 .def 文件构建的,则不会修饰名称。 @Rudy 谢谢,这就是我的意思,但把它弄糊涂了以上是关于如何将C++头文件转换为delphi的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Delphi 中将带有图像的 RichText (RTF) 文档转换为 HTML?