1. 噫!
微软表示:
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
实际上会将你提供给它的指针的值设置为指向它分配的内存的地址。你的代码存在内存泄漏问题,而我之前的片段在释放内存时存在微妙的错误。
让我们通过阅读文档来解决这个问题:
ppszPath [out]
Type: PWSTR*
当该方法返回时,包含指向以空字符结尾的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
类型,而普通的 stringstream
是基于 char
工作的。
幸运的是,有一种宽字符变体叫做 wstringstream
,它使用 wchar_t
。
(需要注意的是,这意味着你的字面常量也必须由 wchar_t
组成,使用 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));