Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Программа установки обычно имеет следующие цели:
- Чтобы разместить файлы в правильном расположении.
- Чтобы уведомить пользователя, если программа установки заменяет существующий файл версией, которая значительно отличается, например, заменив файл немецкого языка на английский или заменив новый файл более старым файлом.
При написании программы установки необходимо иметь следующие сведения для каждого файла:
- Имя и расположение файла (называется исходным файлом).
- Имя эквивалентного файла на жестком диске пользователя (называемое целевым файлом). Обычно это имя совпадает с именем файла на диске установки.
- Состояние общего доступа к файлу, т. е. является ли файл закрытым для установленного приложения или может использоваться несколькими приложениями.
Программа установки может использовать функцию VerFindFile для определения места копирования файла на диске. Эту функцию также можно использовать для указания того, является ли файл закрытым для приложения или может быть предоставлен общий доступ. Если проблема возникает при поиске файла, VerFindFile возвращает значение ошибки. Например, если система использует целевой файл, VerFindFile возвращает VFF_FILEINUSE. Программа установки должна уведомить пользователя о проблеме и ответить на решение пользователя продолжить или завершить установку.
Функция VerInstallFile копирует исходный файл в временный файл в каталоге, указанном VerFindFile. При необходимости VerInstallFile расширяет файл с помощью функций в библиотеке распаковки данных.
VerInstallFile сравнивает сведения о версии временного файла с данными о целевом файле. Если они отличаются, VerInstallFile возвращает одно или несколько значений ошибок. Например, он возвращает VIF_SRCOLD, если временный файл старше целевого файла и VIF_DIFFLANG, если файлы имеют разные идентификаторы языка или значения кодовой страницы. Программа установки должна уведомить пользователя о проблеме и ответить на решение пользователя продолжить или завершить установку.
Некоторые ошибки VerInstallFile можно восстановить. То есть программа установки может снова вызвать VerInstallFile, указав параметр VIFF_FORCEINSTALL, чтобы установить файл независимо от конфликта версии. Если VerInstallFile возвращает VIF_TEMPFILE, а пользователь не выбирает принудительной установки, программа установки должна удалить временный файл.
VerInstallFile может столкнуться с невосстановимой ошибкой при попытке установки с принудительным выполнением, даже если этой ошибки ранее не существовало. Например, файл может быть заблокирован другим пользователем перед попыткой принудительной установки программы установки. Если программа установки пытается принудительно установить после невосстановимой ошибки, VerInstallFile не удается. Программа установки должна содержать подпрограммы для восстановления после этого типа ошибки.
Рекомендуемое решение заключается в отображении диалогового окна с кнопками установить, пропускатьи устанавливать все. (Другое решение — это диалоговое окно с кнопками Да, Да для всех, Пропуститьи Отмена.) Кнопка Установить все должна запретить программе установки запрашивать у пользователя подобные ошибки, включив параметр VIFF_FORCEINSTALL во всех последующих использованиях VerInstallFile. Для неустранимых ошибок кнопки Установить и Установить все должны быть отключены.
Чтобы отобразить пользователю полезное сообщение об ошибке, программа установки обычно должна получать сведения из ресурсов версии конфликтующих файлов. Существует четыре функции, которые программа установки может использовать для этой цели:
GetFileVersionInfoSize возвращает размер сведений о версии. GetFileVersionInfo использует сведения, полученные GetFileVersionInfoSize для получения структуры, содержащей сведения о версии. VerQueryValue извлекает определенный элемент из этой структуры.
Например, если VerInstallFile возвращает ошибку VIF_DIFFTYPE, программа установки должна использовать функции GetFileVersionInfoSize, GetFileVersionInfoи VerQueryValue для получения общего типа каждого файла. Если языки файлов конфликтуют, программа установки также должна использовать VerLanguageName для перевода идентификатора двоичного языка в текстовое представление языка. (Например, 0x040C переводится как "французский".)
Если VerInstallFile возвращает ошибку файла, например VIF_ACCESSVIOLATION, программа установки должна использовать функцию GetLastError, чтобы получить последнее значение ошибки. Программа должна перевести это значение в информативное сообщение, отображаемое пользователю. Программа не должна обеспечить контроль между вызовами VerInstallFile и GetLastError.