1. Юк!
Microsoft говорит :
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*
Когда этот метод возвращает, содержит адрес указателя на завершенную нулем строку Юникода, которая указывает путь к известной папке. Вызывающий процесс отвечает за освобождение этого ресурса, если он больше не нужен, вызывая 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));