1。哎呀!
微软says:
typedef wchar_t* LPWSTR, *PWSTR;
所以让我们从你的测试用例中剔除那些可怕的废话,并丢掉 C 垃圾:
// Fetch Local App Data folder path.
wchar_t* localAppData = new wchar_t[128];
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
delete[] localAppData;
2。警告!
这里有一个严重的缺陷。
SHGetKnownFolderPath 实际上设置了您给它的指针的值,以指向 it 分配的内存。你的代码有内存泄漏,我最后的 sn-p 巧妙地错误地释放了内存。
让我们通过阅读 the documentation 来解决这个问题:
ppszPath [out]
Type: PWSTR*
当此方法返回时,包含指向以 null 结尾的 Unicode 字符串的指针的地址,该字符串指定已知文件夹的路径。一旦不再需要该资源,调用进程负责通过调用 CoTaskMemFree 释放该资源。返回的路径不包含尾部反斜杠。例如,返回“C:\Users”而不是“C:\Users\”。
// Fetch Local App Data folder path.
wchar_t* localAppData = 0;
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
CoTaskMemFree(static_cast<void*>(localAppData));
现在,继续表演。
3。宽字符
您的代码的语法问题是 localAppData 是 wchar_t,但正常的 stringstreams 在 char 上工作。
幸运的是,有一个名为 wstringstream 的宽字符变体使用 wchar_t 代替。
(请注意,这意味着您的文字也必须使用 wchar_ts 构建,使用 L 字符串文字前缀。)
现在是最终代码:
// Fetch Local App Data folder path.
wchar_t* localAppData = 0;
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
wstringstream ss;
ss << localAppData << L"/Google/Chrome/Application/chrome.exe";
CoTaskMemFree(static_cast<void*>(localAppData));