我有一个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数组放入缓冲区并正确打印出字符串?
答案 0 :(得分:4)
Delphi不使用以NULL结尾的字符串,因此您需要在结尾处使用0,因为C / C ++使用它来确定字符串数据的结束位置(Pascal使用开头IIRC处的字符串大小)。 / p>
通常的字符是'\ 0' - 转义值0。
不要忘记返回4个字符,而不是3个字符。
答案 1 :(得分:1)
您的Init功能不起作用,因为
1)pHardcodedMsg是一个没有分配内存的指针
2)CopyMemory不会在pMsg
的末尾添加03)Init的过程标题错过了行尾的半冒号
当您使用Delphi的unicode版本时,您还必须考虑字符串长度和字符集转换