PCWSTR与LPWSTR

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

我现在正试图将一个字符串从C#传递给一个期望PCWSTR的函数,但我能找到的只是[MarshalAs(UnmanagedType.LPWStr)] 。 我纠正那没关系吗? (是的,它有效 。但是,这并不能certificate它没问题。有些东西可以工作,但会导致内存泄漏等)

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

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

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

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

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

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