2013-07-02 47 views
0

我有帶字符串參數德爾福功能:通行證的char *德爾福DLL函數/過程

function a(param: string): integer; 
begin 
{do something} 
end 

如何調用從C該函數++?我將字符串切換到pchar或pansichar,但沒有奏效。 C++的typedef是

typedef int (*StringFunction) (char *a); 

我運行它像

char *b = "abc"; 
StringFunction sf; 
//loading sf 
cout << sf(b); 
+3

也許調用約定?嘗試製作C++和Delphi例程'stdcall'或'cdecl'。 –

回答

4

你不能調用該函數從C++。德爾福string類型是一個私人的Delphi類型。對於互操作你會想要使用一個指向空字符結尾的數組的指針。在C++中是char*,在Delphi中是PAnsiChar

更重要的是,你的Delphi函數使用register調用約定這是一個基於寄存器fastcall約定。同樣,你不能從其他語言訪問它。您需要使用其中一種標準調用約定。

C++代碼中的函數指針已經通過char*,並使用cdecl調用約定。所以你只需要使德爾福功能匹配:

function a(param: PAnsiChar): integer; cdecl; 

上述聲明是與您的問題中的C++代碼兼容。


如果你喜歡使用stdcall那麼你需要同時改變Delphi和C++代碼。

德爾福

function a(param: PAnsiChar): integer; stdcall; 

C++

typedef int (__stdcall *StringFunction) (char *a); 
+0

不,我叫C的delphish函數,它也必須有「cdecl」呢? Uli回答說,我添加了stdcall,現在它可以工作(( – aptypr

+0

)你可以使用'cdecl'或'stdcall'。但是你的問題中的C代碼使用'cdecl',所以我就選擇了這個。如果你願意,你可以使用'stdcall',但你需要改變C++代碼來匹配。 –

+0

@David,或許提及wchar和tchar以獲得完整故事? –