我正在尝试使用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
答案 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
内存将字符串复制到...
在特定情况下:
如果您查看read和write函数的文档,您会发现有问题的结构已传递给const
参数。好吧,实际上,这将使 pointer 不变,而不是所指向的数据,但是假设字符串不会被修改(如果需要,将其复制到某个地方)看起来还是很安全的。 ,并写入到某个文件中),因此实际上使用const_cast
选项应该没问题。
旁注:该示例不会释放再次读回的字符串;现在非常有趣的所有权问题(谁将再次释放他们)?不幸的是,该文档并不准确...