这是我的理解(如果我错了请纠正我),他们之间的唯一区别是字符串是否可能被被调用函数修改。 (PCWSTR,LPWSTR)
我现在正在尝试将C#中的字符串传递给期望 PCWSTR 的函数,但我能找到的只是[MarshalAs(UnmanagedType.LPWStr)]
。我纠正那没关系吗? (是的,工作。但是,这并不能证明它没什么问题。有些事情工作然后导致内存泄漏等。)
答案 0 :(得分:12)
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
是此类字符串的正确编组类型。