2014-12-02 130 views
-1

我想知道是否有人在Delphi中使用PChar var。在Ansi-C導入Delphi Dll

我有與該功能進行通信的模塊(可編程電阻器):

int resCommand(int anH, char* pstr, char *Var); 

如果我會得到來自電阻器的數據,我需要讀取*Var。在模塊 的描述,他們形容這個原型:

function rbResiCommand(aHandle: integer; aData: pChar; VAR aResult: pChar): integer; 

的問題是我怎麼能處理好指針Var aResult,因爲我需要從Var aResult字符串從德爾福的dll?

另外我在這裏有一個Out參數,所以這可能在ANSI C中實現嗎?

我的代碼:

VarResult[255]; 
char *pResult; 

pResult = VarResult; 
get = rbResiCommand(aHandle, "GET0", VarResult); 
printf("Read Data from Channel 0: %s", VarResult); 
+2

這需要更清晰。我無法分辨你是在執行C還是Delphi。無論你是調用函數還是實現它。 PChar是PWideChar還是PAnsiChar。誰分配和釋放什麼內存。你的文字編碼是什麼。調用約定是什麼。我建議你努力改善這個問題。 – 2014-12-02 06:48:12

+0

我可以告訴你'VAR aResult:pChar'不匹配'char *'。 – 2014-12-02 06:49:23

+0

什麼是'VarResult [255];'?看起來像**,在C **中,它會默認爲'int VarResult [255]',這可能不是你想要的。 – 2014-12-02 07:27:38

回答

1

該聲明在C:

int resCommand(int anH, char* pstr, char *Var); 

就等於這個聲明在Delphi:

function resCommand(anH: Integer; pstr: PAnsiChar; Var: PAnsiChar): Integer; cdecl; 

注意使用PAnsiChar代替PCharPChar是德爾福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類型,以及將映射到charwchar_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... 
+0

'System :: Char'不是C.也不是引用。這裏不使用'__fastcall',MS版本或者Borland版本。 – 2014-12-02 08:04:01

+0

這個'__fastcall'只在C++ Builder中有效。 Microsoft和大多數其他Windows編譯器的__fastcall是不同的,並且與Delphi使用的不兼容。所以應該在Delphi中使用'cdecl'或者'stdcall'。 – 2014-12-02 09:15:07

+0

我忘了C沒有引用。我更新了我的答案。 – 2014-12-02 09:34:11