我的理解(如果我错了,请纠正我),它们之间的唯一区别是所调用的函数是否可以修改字符串。 (PCWSTR,LPWSTR)
我现在正在尝试将C#中的字符串传递给期望 PCWSTR 的函数,但是我能找到的只是[MarshalAs(UnmanagedType.LPWStr)]
。我是否正确,可以吗? (是的,它起作用。尽管如此,这并不是一个很好的证明。某些事情可以起作用,但随后会导致内存泄漏等。)
最佳答案
PCWSTR是一种不合时宜的恐龙与人类电影风格。查找在Unicode字符串上使用短指针的16位程序就像查找白象。只有LPCWSTR和LPWSTR之间的区别才有意义。
LPCWSTR中的C只是对const(C语言关键字)的注释。它保证被调用函数永远不会修改您传递的字符串。用该语言知道这一点非常重要,将字符串文字传递给LPWSTR参数并不安全。当程序尝试更新字符串并失败时,这很可能使程序崩溃,因为内存页是只读的。
当您拨票时,这很重要。将System.String传递给LPCWSTR参数很好,因为字符串在.NET中是不可变的,所以您可以确保所插入的字符串文字不会被弄乱。一个很难诊断的问题。通常,不必显式使用[MarshalAs(UnmanagedType.LPWStr)]
,您可以在[DllImport]属性中使用CharSet.Auto属性并免费获得LPWStr编码(marshal)处理。
但是,如果参数类型为LPWSTR,则必须传递一个StringBuilder来代替。具有足够的容量以允许 native 代码在构建器缓冲区中戳入以写入字符串。
关于c# - PCWSTR和LPWSTR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21659751/