2015-08-25 52 views
-1

我正在將C++頭文件轉換爲delphi pas文件。首先,我使用Dr.Bob模塊的HeadConv 4.0轉換C++頭文件。但它編譯失敗。 任何人都可以幫助這個轉換?如何將C++頭文件轉換爲delphi

****** 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代碼,這導致錯誤,如下;

****** 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的保留了Syntex。 我不知道如何用Delphi代碼替換它,並且需要任何幫助。

+0

有沒有這樣的事情作爲一個C#頭文件。你的意思是C++頭文件。參見http://stackoverflow.com/questions/100596/best-resources-for-converting-c-c-dll-headers-to-delphi –

+0

函數KKK_Creat:Integer; STDCALL;外部'TheLibrary.dll'名'KKK_Creat';' – TLama

+0

HeadConv已完全破解。使用'h2p'。 –

回答

2

這不是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文件,函數名稱將被修飾。該功能將被命名爲[email protected]。使用像dumpbin或Dependency Viewer這樣的工具來檢查DLL中導出的函數名稱。我從來沒有找到一個有效的通用頭文件翻譯器,並總是發現最好手動完成這項工作,或者編寫一個定製的頭文件專用翻譯器。

+0

FWIW,如果庫是使用.def文件構建的,則不會對其名稱進行修飾。 –

+0

@Rudy謝謝,這就是我想說的,但是弄糊了 –