如何解决“状态错误(活动)E0513无法将类型为“ const wchar_t *”的值分配给类型为“ wchar_t *”的实体”

时间:2019-10-22 08:52:03

标签: c++ visual-studio

我正在尝试使用C ++更改文件的属性 我究竟做错了什么 ? 该代码已完全使用

https://docs.microsoft.com/en-us/windows/win32/stg/writeread-sample

propspec.ulKind = PRSPEC_LPWSTR;
propspec.lpwstr = L"Property Name";// this line problem

propvarWrite.vt = VT_LPWSTR;
propvarWrite.pwszVal = L"Property Value"; // this line problem

1 个答案:

答案 0 :(得分:0)

错误消息已经表明:字符串文字的类型为const char[]const wchar_t[](取决于基础类型),并且您不能合法地将const数组分配给指向非const的指针(不过,有些编译器接受这样的代码,只是发出警告),仅允许采用另一种方式。

现在的问题是,如何摆脱困境?

通常:

如果您 100%确信(真的,至少没有疑问!)不会修改字符串,则可以将const抛弃:

wchar_t* ptr = const_cast<wchar_t*>(L"...");

如果您对(对字符串文字的修改是未定义的行为!)有疑问,请将该文字复制到数组中:

wchar_t value[] = L"...";
ptr = value;

在这一点上,您需要确保被调用的函数不会取得该字符串的所有权,但是:它会尝试释放该字符串吗?它会将指针存储在某个地方以供以后使用,以便指向的数组必须比调用函数的作用域更长寿吗?

如果是这样,则可能需要使用全局数组或malloc内存将字符串复制到...

在特定情况下:

如果您查看readwrite函数的文档,您会发现有问题的结构已传递给const参数。好吧,实际上,这将使 pointer 不变,而不是所指向的数据,但是假设字符串不会被修改(如果需要,将其复制到某个地方)看起来还是很安全的。 ,并写入到某个文件中),因此实际上使用const_cast选项应该没问题。

旁注:该示例不会释放再次读回的字符串;现在非常有趣的所有权问题(谁将再次释放他们)?不幸的是,该文档并不准确...