У меня есть программное обеспечение, написанное на C ++, установленное на 1000 ПК, которое испытывает некоторые трудности с Windows UAC. Я пытаюсь заставить вещи работать правильно, но мне нужна помощь, чтобы понять проблему и найти правильное решение.
Ситуация следующая: мне нужно записать некоторые данные в некоторые текстовые / XML-файлы, поэтому я начал (в XP) записывать их в исполняемую папку. Не рекомендуется, я знаю. Когда Vista включилась, все файлы начали сохраняться в папку VirtualStore, что было хорошо для меня, поэтому я оставил вещи нетронутыми. Тогда у меня были некоторые проблемы с парой пользователей (см. Проблему 1), но я исправил их вручную, и на этом все. Теперь с Windows 8 я сталкиваюсь с различными проблемами (проблема 2), и я хочу исправить их раз и навсегда.
Теперь я хочу исправить вещи. Мой план состоит в том, чтобы переместить все файлы, которые нужно изменить, в CSIDL_LOCAL_APPDATA и сделать так, чтобы программное обеспечение сохраняло там вещи. В папке программы будут только исполняемые файлы. Однако для обратной совместимости кажется, что я не могу использовать SHGetKnownFolderPath, который кажется специфичным для Vista +. Так что я бы использовал SHGetFolderPath, который, как я знаю, устарел, но должен работать в XP и действовать как оболочка SHGetKnownFolderPath в Vista +, что хорошо для меня.
Мои вопросы:
Большое спасибо за любую помощь, которую вы можете предоставить.
Лука
Это мои идеи к проблемам 1 & 2:
1. Если вы пишете файлы, с которыми работает ваше приложение, ваши файлы будут записаны в подкаталог C: \ Program Files. Для записи файлов в этом месте (C: \ Program Files) ваше приложение должно быть запущено от имени администратора. В целях совместимости Windows Vista будет записывать данные в VirtualStore, если вы попытаетесь записать данные в каталоги, в которые вам нужны права администратора для записи данных.
2. Windows 8 больше не использует VirtualStore. Однако доступ для чтения не требует прав администратора.
Да, ваш план соответствует требованиям UAC. Ваша программа и файлы, используемые вашей программой, должны быть сохранены в двух разных каталогах.
Я бы использовал SHGetFolderPath функция для того, чтобы получить путь к каталогу AppData. Кроме того, эта функция совместима с Windows XP. Вы можете проверить версию операционной системы и использовать соответствующую функцию / интерфейс для этой версии. GetVersion и GetVersionEx были изменены в Windows 8. Именно поэтому я рекомендую использовать Функции Version Helper для проверки версий в Windows 8.
Других решений пока нет …