C ++ проблемы с Windows UAC

У меня есть программное обеспечение, написанное на C ++, установленное на 1000 ПК, которое испытывает некоторые трудности с Windows UAC. Я пытаюсь заставить вещи работать правильно, но мне нужна помощь, чтобы понять проблему и найти правильное решение.

Ситуация следующая: мне нужно записать некоторые данные в некоторые текстовые / XML-файлы, поэтому я начал (в XP) записывать их в исполняемую папку. Не рекомендуется, я знаю. Когда Vista включилась, все файлы начали сохраняться в папку VirtualStore, что было хорошо для меня, поэтому я оставил вещи нетронутыми. Тогда у меня были некоторые проблемы с парой пользователей (см. Проблему 1), но я исправил их вручную, и на этом все. Теперь с Windows 8 я сталкиваюсь с различными проблемами (проблема 2), и я хочу исправить их раз и навсегда.

  1. Первая проблема: с Windows Vista случалось так, что некоторые пользователи в конечном итоге находили свое программное обеспечение «пустым», как это было, когда он только что был установлен. Вся их работа над этим ушла. Оказалось, что неожиданно Vista искала свои файлы в C: \ Program Files \ {MyApp} вместо того, чтобы искать в VirtualStore. Копирование файлов из VirtualStore в папки Program решило проблему, так и не поняв, почему
  2. Вторая проблема: теперь с Windows 8 некоторые пользователи [меньшинство] испытывают другой, странный факт; Похоже, мое приложение не может создавать файлы в VirtualStore, но оно может редактировать существующие файлы. Так что, если я создаю файлы вручную, все работает. Если не приложение не работает: файлы не изменяются ни в папке программы, ни в виртуальном магазине

Теперь я хочу исправить вещи. Мой план состоит в том, чтобы переместить все файлы, которые нужно изменить, в CSIDL_LOCAL_APPDATA и сделать так, чтобы программное обеспечение сохраняло там вещи. В папке программы будут только исполняемые файлы. Однако для обратной совместимости кажется, что я не могу использовать SHGetKnownFolderPath, который кажется специфичным для Vista +. Так что я бы использовал SHGetFolderPath, который, как я знаю, устарел, но должен работать в XP и действовать как оболочка SHGetKnownFolderPath в Vista +, что хорошо для меня.

Мои вопросы:

  • любые идеи о моих проблемах 1 & 2? Я хотел бы понять их, чтобы быть уверенным, что победил их полностью.
  • соответствует ли мой план UAC? Насколько я понимаю, но …
  • Любой способ обеспечить совместимость с XP, но для моего решения? Я не чувствую себя комфортно, используя устаревшие функции, но я определенно не хочу иметь две версии (XP и Vista +), чтобы иметь дело с!

Большое спасибо за любую помощь, которую вы можете предоставить.
Лука

2

Решение

Это мои идеи к проблемам 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.

0

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

Других решений пока нет …

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