【问题标题】:PCWSTR vs LPWSTRPCWSTR 与 LPWSTR
【发布时间】:2014-03-06 18:05:38
【问题描述】:

我的理解(如果我错了,请纠正我)它们之间的唯一区别是字符串是否可能被调用的函数修改。 (PCWSTR,LPWSTR)

我现在正试图将 C# 中的字符串传递给期望 PCWSTR 的函数,但我只能找到 [MarshalAs(UnmanagedType.LPWStr)]。我说得对吗? (是的,它有效。不过,这并不能证明它很好。有些东西有效,但会导致内存泄漏等)

【问题讨论】:

    标签: c# c++ .net winapi interop


    【解决方案1】:

    采用PCWSTR 参数的函数不能使用该参数来修改字符串的字符,这与采用LPWSTR 参数的函数不同。字符串的每个字符都存储为WCHAR

    UnmanagedType.LPWStr 是此类字符串的正确编组类型。

    【讨论】:

    • PCWSTR 和 LPWSTR 都使用 WCHAR 来存储字符。这就是他们名字中的“W”。
    【解决方案2】:

    PCWSTR 是一种时间不合时宜的恐龙和人类电影风格。寻找一个在 Unicode 字符串上使用短指针的 16 位程序就像寻找一头白象。只有 LPCWSTR 和 LPWSTR 之间的区别才有意义。

    LPCWSTR 中的 C 只是 C 语言关键字 const 的注释。它保证被调用的函数永远不会修改您传递的字符串。在该语言中了解这一点非常重要,将字符串文字传递给 LPWSTR 参数是不安全的。这很可能在程序尝试更新字符串并失败时崩溃,因为内存页面是只读的。

    当您进行 pinvoke 时,这很重要。将 System.String 传递给 LPCWSTR 参数很好,字符串在 .NET 中是不可变的,因此您可以保证内部字符串文字不会被破坏。一个很难诊断的问题。通常不需要显式使用[MarshalAs(UnmanagedType.LPWStr)],您可以在 [DllImport] 属性中使用 CharSet.Auto 属性并免费获得 LPWStr 封送处理。

    但如果参数类型是 LPWSTR,那么您必须改为传递 StringBuilder。具有足够的容量以允许本机代码在构建器缓冲区中四处寻找以写入字符串。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2019-04-05
      • 1970-01-01
      相关资源
      最近更新 更多