据我了解(如果我错了,请纠正我)它们之间的唯一区别是字符串是否可以被调用的函数修改。 (PCWSTR , LPWSTR)
我现在尝试将一个字符串从 C# 传递到一个期望的函数PCWSTR,但我能找到的只是[MarshalAs(UnmanagedType.LPWStr)]
。我说得对吗? (是的,它works。但这并不能证明它没问题。有些事work但随后会导致内存泄漏等)
PCWSTR 是一种不合时宜的恐龙和人类电影风格。查找在 Unicode 字符串上使用短指针的 16 位程序就像查找白象一样。只有区分 LPCWSTR 和 LPWSTR 才有意义。
LPCWSTR 中的 C 只是注释const,C 语言关键字。它承诺被调用的函数永远不会修改您传递的字符串。在该语言中了解这一点非常重要,将字符串文字传递给 LPWSTR 参数是不安全的。当程序尝试更新字符串并失败时,很可能会导致程序崩溃,因为内存页是只读的。
当你调用时这很重要。将 System.String 传递给 LPCWSTR 参数是可以的,字符串在 .NET 中是不可变的,因此您可以保证内部字符串文字不会被破坏。一个非常难以诊断的问题。使用[MarshalAs(UnmanagedType.LPWStr)]
一般来说,显式不需要,您可以使用 [DllImport] 属性中的 CharSet.Auto 属性并免费获得 LPWStr 封送处理。
但如果参数类型是 LPWSTR 那么你must而是传递一个 StringBuilder 。有足够的容量允许本机代码在构建器缓冲区中查找以写入字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)