在C ++和Delphi DLL之间传递PChar / * char

时间:2010-10-16 13:20:47

标签: c++ string delphi dll

我有一个C ++程序,它调用Delphi DLL来初始化包含字符的缓冲区。

我正在测试界面以确保数据正确传递:

在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 )时, 它向我显示“123”后跟一些垃圾字符。

为什么会这样? 如何成功将char数组放入缓冲区并正确打印出字符串?

2 个答案:

答案 0 :(得分:4)

Delphi不使用以NULL结尾的字符串,因此您需要在结尾处使用0,因为C / C ++使用它来确定字符串数据的结束位置(Pascal使用开头IIRC处的字符串大小)。 / p>

通常的字符是'\ 0' - 转义值0。

不要忘记返回4个字符,而不是3个字符。

答案 1 :(得分:1)

您的Init功能不起作用,因为

1)pHardcodedMsg是一个没有分配内存的指针

2)CopyMemory不会在pMsg

的末尾添加0

3)Init的过程标题错过了行尾的半冒号

当您使用Delphi的unicode版本时,您还必须考虑字符串长度和字符集转换