【问题标题】:Incompatible Types PAnsiChar and PWideChar since StrAlloc returns PWideChar with StrAlloc不兼容的类型 PAnsiChar 和 PWideChar 因为 StrAlloc 返回 PWideChar 和 StrAlloc
【发布时间】:2014-09-10 05:47:23
【问题描述】:

我知道这可能很简单,但有时 Unicode 问题会因为考虑太多而困扰我。

我有这个代码:

pcBuffer := StrAlloc(Stream.Size + 1) where pcBuffer is defined as PWideChar

组件现在需要pcBuffer as PAnsiChar,所以如果我这样做,我会收到错误

StrAlloc- 不兼容的类型 PAnsiChar 和 PWideChar

因为 StrAlloc 返回 PWideChar

我该如何解决这个问题?

我可以简单地以 Unicode 方式或通过 GetMem 将类型转换为 PAnsiChar or alloacate 吗?

【问题讨论】:

    标签: delphi delphi-xe6


    【解决方案1】:

    在 Delphi XE 中,SysUtils 单元定义了以下函数:

    function AnsiStrAlloc(Size: Cardinal): PAnsiChar;
    function WideStrAlloc(Size: Cardinal): PWideChar;
    function StrAlloc(Size: Cardinal): PChar;
    

    您应该调用AnsiStrAlloc 来分配PAnsiChar。这会收到一个以字符为单位的Size。您必须考虑空终止符。

    var
      pcBuffer: PAnsiChar;
    ....
    pcBuffer := AnsiStrAlloc(Stream.Size + 1);
    

    但是,这些功能应被视为已弃用。它们在 Delphi 的较新版本中被如此记录。相反,您可能应该使用AnsiString,让编译器管理生命周期和内存分配。

    var
      str: AnsiString;
      pcBuffer: PAnsiChar;
    ....
    SetLength(str, Stream.Size);
    pcBuffer := PAnsiChar(str);
    

    缓冲区的生命周期由编译器管理,就像任何 Delphi 字符串变量一样。

    上面的代码很可能不是解决您的实际问题的最佳方法。如果没有看到更多细节,很难确定最好的解决方案是什么。我唯一有信心的是StrAlloc 和朋友不是前进的方向。

    【讨论】:

    • @Shanand 通过让字符串离开作用域,或将其设置为 '' 或调用 Finalize 等来处理字符串。显然,使用您选择的任何功能,甚至如果您选择不推荐使用的功能。奇怪的是,您接受了一个看似错误的答案,尽管是在细节问题上,并提到了无法在 XE(标记版本)中编译的代码。你不使用XE是吗?你的评论很混乱。努力回答并发现问题的关键细节错误是令人沮丧的。我相信 Remy 会在适当的时候修复他的答案中的代码。
    • 大卫:抱歉.. 错误地勾选了错误的答案.. 但我至少缩小了使用范围 - AnsiStrings.AnsiStrAlloc(Stream.Size + 1) 正如 remy 所建议的那样;然后由您更正。既然你在 Remy's 下发表评论,我就勾选了。相反,我对您对他的评论的回复感到满意,这对我有用。我认为我的问题很清楚你在哪里正确回答,谢谢你的帮助!将来肯定需要您的帮助。
    • D2007 中的现有代码,需要在 XE6 中重写该行(这是问题所在)。无论如何-它已解决,我正在处理其他问题。谢谢大卫和雷米
    【解决方案2】:

    您正在从分配PWideCharSysUtils 单元调用StrAlloc()

    要改为分配PAnsiChar,请从AnsiStrings 单元调用StrAlloc()

    uses
      ..., AnsiStrings;
    
    pcBuffer := AnsiStrings.StrAlloc(Stream.Size + 1);
    

    【讨论】:

    • 据我所知,从未有过任何名为AnsiStrings.StrAlloc 的东西。你可能在想AnsiStrings.AnsiStrAlloc。但是问题被标记为 XE,在这种情况下甚至不存在 AnsiStrings.AnsiStrAlloc。在 XE 中,函数是 SysUtils.AnsiStrAlloc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多