Нам нужно надежно получить папку быстрого запуска как для всех, так и для текущих пользователей как в Vista, так и в XP. Я разрабатываю на С++, но это, вероятно, больше общий вопрос Windows API.
Для справки, вот код для получения папки Application Data в обеих системах:
HRESULT hres;
CString basePath;
hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
basePath.ReleaseBuffer();
Я подозреваю, что это просто вопрос того, какую подпапку использует Microsoft.
В Windows XP вложенная папка данных приложения:
Microsoft\Internet Explorer\Быстрый запуск
Под Vista кажется, что подпапка была изменена на:
Роуминг\Microsoft\Internet Explorer\Быстрый запуск
но я хотел бы убедиться, что это правильный способ определить правильное местоположение.
Очень важно найти правильный способ определения этого местоположения, так как опора на жестко закодированные имена папок почти всегда ломается при переходе к международным установкам и т. д. Тот факт, что папка называется «Роуминг», в Vista я задаюсь вопросом, есть ли какая-то особая обработка, связанная с этой папкой (похожая на папку «Локальные настройки» в XP).
EDIT: следующая статья msdn: http://msdn.microsoft.com/en-us/library/bb762494.aspx указывает, что CSIDL_APPDATA имеет идентификатор, эквивалентный FOLDERID_RoamingAppData, что, похоже, подтверждает утверждение StocksR о том, что CSIDL_APPDATA действительно возвращает C:\Users\xxxx\AppData\Roaming, поэтому должна быть возможность используйте тот же относительный путь для CSIDL_APPDATA, чтобы перейти к быстрому запуску (\Microsoft\Internet Explorer\Quick Launch).
Таким образом, следующий алгоритм является правильным для MS:
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 прошел успешно.