喔!
微軟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
實際設置您指定給它的指針的值指向它分配的內存。你的代碼有內存泄漏,而我的最後一段代碼錯誤地微妙地釋放了內存。
讓我們修復通過讀取the documentation:
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
S於char
工作。
幸運的是,有一個稱爲wstringstream
的寬字符變體,它使用wchar_t
代替。
(請注意,這意味着你的文字將被建造出來的wchar_t
S,也使用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));
看到我的答案,一種方式之間轉換多字節和寬字符,反之亦然。參見安德烈的另一種方式。請參閱Praetorian或Tomalak Geret'kal,瞭解您應該做什麼。 – AJG85