PCWSTR与LPWSTR

时间:2014-02-09 13:42:19

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

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

我现在正在尝试将C#中的字符串传递给期望 PCWSTR 的函数,但我能找到的只是[MarshalAs(UnmanagedType.LPWStr)]。我纠正那没关系吗? (是的,工作。但是,这并不能证明它没什么问题。有些事情工作然后导致内存泄漏等。)

2 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:2)

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

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