PCWSTR与LPWSTR

isp*_*iro 6 .net c# c++ winapi interop

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

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

Han*_*ant 13

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

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

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

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