Использование сведений о версии

Программа установки обычно преследует следующие цели:

  • Размещение файлов в правильном расположении.
  • Чтобы уведомить пользователя, если программа установки заменяет существующий файл на версию, которая значительно отличается, например, заменяет файл на немецком языке файлом на английском языке или заменяет более новый файл более старым файлом.

При написании программы установки необходимо иметь следующие сведения для каждого файла:

  • Имя и расположение файла (называется исходным файлом).
  • Имя эквивалентного файла на жестком диске пользователя (называется целевым файлом). Обычно это имя совпадает с именем файла на диске установки.
  • Состояние общего доступа к файлу, т. е. является ли файл частным для устанавливаемого приложения или может быть совместно использоваться несколькими приложениями.

Программа установки может использовать функцию 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.