該聲明在C:
int resCommand(int anH, char* pstr, char *Var);
就等於這個聲明在Delphi:
function resCommand(anH: Integer; pstr: PAnsiChar; Var: PAnsiChar): Integer; cdecl;
注意使用PAnsiChar
代替PChar
( PChar
是德爾福20中PAnsiChar
的別名07和更早版本,但在Delphi 2009和更高版本中是PWideChar
的別名)以及明確的cdecl
調用約定。
這個聲明在Delphi:
function rbResiCommand(aHandle: integer; aData: pChar; VAR aResult: pChar): integer;
等於該聲明在C:
int __fastcall rbResiCommand(int aHandle, Char *aData, Char** aResult);
注意使用Char
(大寫C
),而不是char
(小寫c
),一個額外的最後一個參數的間接級別以及不同的調用約定(__fastcall
而不是__cdecl
)。
Char
(大寫C
)是一個C++生成器typedef
爲Delphi的本地Char
類型,以及將映射到char
,wchar_t
,或char16_t
根據需要,取決於編譯器和RTL版本。
__fastcall
在這種情況下只適用於C++ Builder,它與Delphi特有的功能兼容。沒有其他的C/C++編譯器支持Borland的__fastcall
。微軟的__fastcall
是別的東西 - C++ Builder支持它爲__msfastcall
)。
假設調用約定被簡單地省略rbResiCommand
文檔中,真正是cdecl
在DLL,並且該DLL是寫在一個版本的Delphi其中PChar
映射到PAnsiChar
,那麼你的C代碼應該是這樣的:
int __cdecl rbResiCommand(int aHandle, char* aData, char** aResult);
...
char VarResult[255];
char *pResult = VarResult;
get = rbResiCommand(aHandle, "GET0", &pResult);
printf("Read Data from Channel 0: %s", VarResult);
在這兩種情況下,這是假設的DLL只是填充數組中你提供給它(在這種情況下,額外的間接是沒有必要的),而不是分配它自己的內存,並返回給你使用(這是額外的間接通常使用的)。如果是分配內存,那麼你需要擺脫你的陣列:
int __cdecl rbResiCommand(int aHandle, char* aData, char** aResult);
...
char *pResult = NULL;
get = rbResiCommand(aHandle, "GET0", &pResult);
printf("Read Data from Channel 0: %s", pResult);
// free pResult however the DLL requires you to free it...
這需要更清晰。我無法分辨你是在執行C還是Delphi。無論你是調用函數還是實現它。 PChar是PWideChar還是PAnsiChar。誰分配和釋放什麼內存。你的文字編碼是什麼。調用約定是什麼。我建議你努力改善這個問題。 – 2014-12-02 06:48:12
我可以告訴你'VAR aResult:pChar'不匹配'char *'。 – 2014-12-02 06:49:23
什麼是'VarResult [255];'?看起來像**,在C **中,它會默認爲'int VarResult [255]',這可能不是你想要的。 – 2014-12-02 07:27:38