【问题标题】:Passing PChar / *char between C++ and Delphi DLL在 C++ 和 Delphi DLL 之间传递 PChar / *char
【发布时间】:2010-10-16 13:20:46
【问题描述】:

我有一个 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 数组放入缓冲区并正确打印字符串?

【问题讨论】:

    标签: c++ string delphi dll


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我这样做了,它打印正确:phardcodedMsg:= '123'#0; CopyMemory(pMsg, pHardcodedMsg, 长度(pHardcodedMsg)+1);
    • -1 表示“Delphi 不使用以 NULL 结尾的字符串”。 Delphi 字符串以 NULL 结尾,无需添加终止 0 - 它已经存在。您只需要使用 4 个字符而不是 3 个字符。
    • Delphi 字符串不是空终止的(空不终止字符串)。但是你是对的,字符串和文字在字符串内容之后有一个空值。不过,它可能不是第一个。
    • Delphi 字符串以空字符结尾。 Delphi 不依赖字符串末尾的空字符,但它确实在某种程度上强制 MyString[Length(MyString) + 1] = #0。尽管 Delphi 不依赖 null 本身,但它确实依赖于在每个 Windows API 调用中应该有一个 null 的事实。因此,如果您更改 delphi 附加到字符串的空字符,您将遇到很多问题。
    【解决方案2】:

    您的 Init 函数不起作用,因为

    1) phardcodedMsg 是您没有为其分配内存的指针

    2) CopyMemory 不会在 pMsg 末尾添加 0

    3) Init 的过程头在行尾少了一个分号

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

    【讨论】:

      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多