Как вы надежно получаете папку быстрого запуска в XP и Vista?

StackOverflow https://stackoverflow.com/questions/76080

  •  09-06-2019
  •  | 
  •  

Вопрос

Нам нужно надежно получить папку Быстрого запуска как для всех, так и для текущих пользователей как в Vista, так и в XP.Я разрабатываю на C ++, но это, вероятно, скорее общий вопрос Windows API.

Для справки, вот код для получения папки данных приложения в обеих системах:

    HRESULT hres; 
    CString basePath;
    hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
    basePath.ReleaseBuffer();

Я подозреваю, что это всего лишь вопрос знания того, какую подпапку использует Microsoft.

В Windows XP вложенная папка App data находится:

Microsoft\ Internet Explorer\ Быстрый запуск

В Vista кажется, что вложенная папка была изменена на:

Роуминг\Microsoft\ Internet Explorer\ Быстрый запуск

но я хотел бы убедиться, что это правильный способ определения правильного местоположения.

Нахождение правильный способ определения этого местоположения довольно важен, так как использование жестко закодированных имен папок почти всегда прерывается при переходе на международные установки и т.д...Тот факт, что папка называется "Roaming" в Vista, заставляет меня задаться вопросом, существует ли какая-то специальная обработка, связанная с этой папкой (аналогично локальной папке настроек в XP).

Редактировать:Следующая статья msdn: http://msdn.microsoft.com/en-us/library/bb762494.aspx указывает, что CSIDL_APPDATA имеет эквивалентный ИДЕНТИФИКАТОР FOLDERID_RoamingAppData, который, похоже, подтверждает утверждение StocksR о том, что CSIDL_APPDATA возвращает C:\Users\xxxx\AppData oaming , поэтому должна быть возможность использовать тот же относительный путь для CSIDL_APPDATA, чтобы перейти к быстрому запуску (\Microsoft\Internet Explorer\Quick Launch).

Таким образом, следующий алгоритм корректен для каждой МС:

HRESULT hres; 
CString basePath;
hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
basePath.ReleaseBuffer();
CString qlPath = basePath + "\\Microsoft\\Internet Explorer\\Quick Launch";

также было бы неплохо проверить hres, чтобы убедиться, что вызов SHGetSpecialFolderPath прошел успешно.

Это было полезно?

Решение

AppData в Vista относится к C:\Users\xxxx\AppData oaming, а не к самой C:\Users\xxxx\AppData папке.

Также этот артикальный http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx на сайте Microsoft подразумевается, что вам просто нужно использовать путь относительно папки appdata

Другие советы

Отличный вопрос!

Что бы ты ни делал, не надо поддайтесь искушению покопайтесь в реестре чтобы найти эту информацию!

Кроме того, мы должны противостоять искушению жестко закодировать какой-то путь, даже частично.Если мы получим специальный путь к AppData, а затем просто добавим строку в конец, это может привести к сбою при установке программного обеспечения за пределами США, где имя папки локализовано на этот язык.Например. GetSpecialFolderPath(APP_DATA) + "\\Fonts" не будет работать в неанглоязычных версиях Windows.

Надеюсь, у кого-нибудь есть правильный ответ на ваш вопрос;Мне самому любопытно это узнать!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top