2010-10-16 192 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