Начиная с C ++, на момент написания этой статьи Microsoft рекомендует использовать SHGetKnownFolderPath
с желаемым значением KNOWNFOLDERID
enum. Значение, которое вам нужно использовать: FOLDERID_CommonStartMenu
. В вашем случае код будет выглядеть так:
wchar_t * path = nullptr;
const auto result = SHGetKnownFolderPath(FOLDERID_CommonStartMenu, 0, NULL, &path);
if (S_OK == result)
{
// do what you want with path, f.ex. create string from it
std::wstring pathAsString(path);
// according to documentation, calling process is responsible for freeing this resource
CoTaskMemFree(path);
}
Ссылка SHGetKnownFolderPath
есть:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx
Ссылка на все доступные значения enum KNOWNFOLDERID
есть:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
Информацию о том, что вызывающий процесс отвечает за освобождение ресурса, можно найти в документации по SHGetKnownFolderPath
в части, документирующей параметр ppszPath
.
Обратите внимание, что при запуске из службы некоторые значения недоступны (например, связанные с данными пользователя, например: FOLDERID_Documents
). Более того, если некоторые значения недоступны, если вы используете другую архитектуру (например, значение, связанное с FOLDERID_ProgramFilesX64
, недоступно в 32-разрядной операционной системе).
Если кто-то хочет знать, где Microsoft рекомендует использовать SHGetKnownFolderPath
вместо других доступных функций, пожалуйста, прочитайте верхнюю часть документации по устаревшим SHGetFolderPath
.