Получить путь к меню всех пользователей в Windows

Я ищу способ получить путь к каталогу меню Пуск всех пользователей в C ++. Я могу получить только одного текущего пользователя (используя Qt):

QString startMenuPath = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).at(0);

Однако Qt не позволяет получить его для всех пользователей. Насколько я знаю, нет также переменной окружения, содержащей этот путь, который я мог бы прочитать.

-1

Решение

Чтобы получить известную папку, используйте SHGetFolderPath, и передать KNOWNFOLDERID или же CSIDL для нужной папки.

Например, следующий код получает всех пользователей Start Menu и Programs папка:

// Remember to #include <Shlobj.h>

WCHAR path[MAX_PATH];

HRESULT hr = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, path);
if (SUCCEEDED(hr))
std::wcout << L"Start Menu\Programs: " << path << std::endl;

hr = SHGetFolderPathW(NULL, CSIDL_COMMON_STARTMENU, NULL, 0, path);
if (SUCCEEDED(hr))
std::wcout << L"Start Menu: " << path << std::endl;
6

Другие решения

Спасибо пользователю theB за решение. Вот мой последний фрагмент кода для создания ярлыка в меню «Пуск» для всех пользователей в Windows (использует Qt):

#include <shlobj.h>

bool createStartMenuEntry(QString targetPath) {
targetPath = QDir::toNativeSeparators(targetPath);

WCHAR startMenuPath[MAX_PATH];
HRESULT result = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, startMenuPath);

if (SUCCEEDED(result)) {
QString linkPath = QDir(QString::fromWCharArray(startMenuPath)).absoluteFilePath("Some Link.lnk");

CoInitialize(NULL);
IShellLinkW* shellLink = NULL;
result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&shellLink);
if (SUCCEEDED(result)) {
shellLink->SetPath(reinterpret_cast<LPCWSTR>(targetPath.utf16()));
shellLink->SetDescription(L"Description");
shellLink->SetIconLocation(reinterpret_cast<LPCWSTR>(targetPath.utf16()), 0);

IPersistFile* persistFile;
result = shellLink->QueryInterface(IID_IPersistFile, (void**)&persistFile);

if (SUCCEEDED(result)) {
result = persistFile->Save(reinterpret_cast<LPCOLESTR>(linkPath.utf16()), TRUE);

persistFile->Release();
} else {
return false;
}
shellLink->Release();
} else {
return false;
}
} else {
return false;
}
return true;
}
2

Путь к меню запуска любого пользователя будет (в Windows 7)

C: \ Users \username\ AppData \ Roaming \ Microsoft \ Windows \ Пуск

Для меню Пуск всех пользователей (в Windows 7) это

C: \ ProgramData \ Microsoft \ Windows \ Пуск

Однако только администратор и сам пользователь будут иметь беспрепятственный доступ к папкам каждого пользователя; всем остальным не хватит прав на чтение / запись. Вы можете обойти это, запустив программу от имени администратора, но вместо этого вы можете пересмотреть дизайн своей программы, поскольку решение, которое зависит от доступа к системным папкам, по своей конструкции будет нестабильным.

-2
По вопросам рекламы [email protected]