Как заставить мою программу работать в Windows Vista и Windows 7? - PullRequest
8 голосов
/ 05 января 2010

У меня есть приложение, написанное на Delphi 2006, которое отлично работало в Windows XP. Я упаковал приложение, используя Inno Setup, используя Program Files в качестве папки по умолчанию. Несколько пользователей перешли на Windows Vista и Windows 7. Проблема в том, что приложение создает некоторые файлы в своей папке установки самостоятельно. Это работало в XP, но в Windows Vista у пользователей были проблемы с созданными файлами (они не появляются и так далее). После изучения отчетов пользователей я обнаружил KB 927387 : «Общие проблемы виртуализации файлов и реестра в Windows Vista или Windows 7».

Запуск приложения с правами администратора просто решает проблему, но это (я думаю) ужасный обходной путь. Я хотел бы знать, есть ли какие-либо директивы или советы по обеспечению совместимости приложения с Vista и 7, поскольку в скором времени все больше пользователей перейдут на эти ОС.

Ответы [ 5 ]

13 голосов
/ 05 января 2010

Вам нужно переписать ваше приложение, чтобы хранить его файлы в нужных местах, даже в XP, но особенно в Vista и далее, особенно если включен UAC. Это становится все более и более важным, чтобы получить права, поскольку Microsoft продолжает блокировать и применять свои модели безопасности с каждой новой версией ОС. Правила правильного управления файлами приложений и пользователей задокументированы в MSDN, например: «Спецификация приложений для Microsoft Windows 2000 для настольных приложений, глава 4: Управление данными и настройками» * и «Спецификация приложений для Microsoft Windows 2000 для настольных приложений Приложение A: Рекомендации» (да, они старые, но все еще весьма актуальны). Посмотрите на SHGetSpecialFolderLocation (), SHGetFolderPath (), SHGetKnownFolderPath () и другие связанные функции, чтобы помочь вам.

12 голосов
/ 05 января 2010

Для Vista / Win7 ваше приложение не может поместить файлы в подпапку Program Files / Programs, если UAC не выключен или приложение не запущено с повышенными правами. Обратите внимание, что «повышенные» не обязательно означают «вошел в систему как администратор». Пользователи, не являющиеся администраторами, могут повышаться, а уровень администратора не обязательно повышен.

Если приложение пытается выполнить запись в Program Files, но не имеет повышенных прав, ОС либо блокирует приложение, либо «виртуализирует» запись (помещает файлы в другое место) в зависимости от того, как настроен UAC. Ни один из них не помогает приложению преуспеть в том, к чему оно стремилось.

Так что нужно положить их куда-нибудь еще. Где зависит от того, почему файлы создаются, и вы не сказали нам об этом. Вы можете прочитать эту статью , чтобы узнать о возможностях. Обратите внимание, что в дополнение к папкам AppData и Roaming пользователя существует также профиль «Все пользователи» (общий).

Вам, вероятно, следует взглянуть на эту статью и скринкаст , в котором подробно рассматривается UAC с точки зрения Delphi.

4 голосов
/ 05 января 2010

Файлы, которые вы создаете для использования вашим приложением, кроме времени установки, должны помещаться в каталог ProgramData, если он глобален для рабочей станции, или в каталог пользователей ApplicationData, если он специфичен для пользователя.

В тех случаях, когда вам абсолютно необходимо поместить файл в каталог программных файлов, вы можете использовать com для запроса повышения прав. Это обсуждается очень подробно , и специальные биты delphi также доступны .Один из примеров, который я использовал, - это исправление базы установки моих пользователей.UAC предупреждает их, что система должна вносить изменения, поэтому, если вы делаете это как автоматизированную задачу, вам, возможно, придется переосмыслить логику, чтобы больше ориентироваться на пользователя.

3 голосов
/ 05 января 2010

Вот другая статья , написанная Зарко Гаджичем, в которой показано, как получить разные системные каталоги. Также взгляните на этот связанный вопрос .

2 голосов
/ 05 января 2010

У меня был похожий запрос здесь (переполнение стека).

В конце я понял, что мне нужно поместить свое приложение в Program Files во время установки (требующий UAC / повышение прав) и затем сохранить данные моего приложения в папке данных приложения пользователя. Мне пришлось изменить способ, которым моя программа генерировала параметры конфигурации «по умолчанию», а также место, где я сохранял этот материал, но в итоге это стоило усилий - в итоге мы получили что-то, что отлично устанавливается и работает на XP, Vista и Windows 7 .

Единственный удар UAC, который мы получаем, происходит во время установки, что имеет смысл для меня (и вы получаете аналогичный удар во время установки на Mac тоже). У нас не было данных, которые были бы общими для всех пользователей в данном конкретном случае, но я бы посмотрел на специальную папку Program Data, если бы это было так.

Программное обеспечение установщика, которое мы используем (Setup Factory), сделало это довольно просто (мы просто написали небольшой кусочек кода для определения XP по сравнению с Vista / Win7 и соответственно выбрали нужную специальную папку). Это было бы легко сделать в Inno Setup, исходя из того ограниченного опыта, который у меня есть.

...