2010-10-16 191 views
1

我有一個C++程序,它調用Delphi DLL來初始化包含字符的緩衝區。在C++和Delphi之間傳遞PChar/* char

我測試出來的接口,以確保數據正確傳遞:

在C++程序:

char * pMsg = (char*)malloc(3); //allocate buffer 

Init(pMsg * char); //Delphi DLL function 

在Delphi中DLL:

procedure Init(pMsg:PChar); 
var 
    pHardcodedMsg:PChar; 
begin 
    pHardcodedMsg:= '123'; 
    CopyMemory(pMsg, pHardcodedMsg, Length(pHardcodedMsg)); 
end; 

但,當我嘗試在C++ printf((const char*)pMsg), 它顯示m e「123」後跟一些垃圾字符。

這是爲什麼? 如何成功地將一個char數組放入緩衝區並讓字符串正確打印出來?

回答

4

Delphi不使用以NULL結尾的字符串,因此您需要在結尾處敲擊0,因爲C/C++使用它來確定字符串數據的結束位置(Pascal在開始IIRC時使用字符串的大小)。

常用的字符是「\ 0」 - 轉義值0

不要忘了返回4個字符,而不是3

+0

感謝。我這樣做,它打印出正確的:pHardcodedMsg:='123'#0; CopyMemory(pMsg,pHardcodedMsg,Length(pHardcodedMsg)+1); – seveleven 2010-10-16 13:31:56

+4

-1代表「Delphi不使用以NULL結尾的字符串」。 Delphi字符串以NULL結尾,並且不需要添加終止0 - 它已經在那裏。您所需要的只是使用4個字符而不是3個。 – kludg 2010-10-16 13:48:19

+2

Delphi字符串不是空終止的(null不會終止字符串)。但是你是對的,因爲字符串和文字在字符串內容之後有一個空值。它可能不是第一個。 – 2010-10-16 16:41:29

1

你的初始化函數不起作用,因爲

1 )pHardcodedMsg是要爲其未分配存儲器的指針

2)CopyMemory的不0添加到PMSG

的端

3)過程標題在該行

年底的初始化錯過了分號當您使用德爾福的Unicode版本也將不得不考慮字符串的長度和字符集轉換

+0

1)當設置爲:='123'時,它已經分配了內存。 – seveleven 2010-10-20 15:03:32