#windows-installer
#windows-установщик
Вопрос:
Я создаю пакет MSI, который должен установить одну из нескольких версий определенного исполняемого файла, в зависимости от версии Windows (т. Е. Ту, которая использует новые функциональные возможности в Windows Vista, и ту, которая выполняет саму работу).
Имя исполняемого файла должно быть одинаковым, какая бы версия не была установлена (иначе это было бы тривиально, не так ли?).
Каков правильный способ добиться этого с помощью установщика Windows?
Ответ №1:
Абсолютно лучший способ сделать это — сделать так, чтобы EXE-файл мог определять свою собственную операционную среду и выбирать другой метод в зависимости от того, что предоставляет ОС, чтобы иметь дело только с одним двоичным файлом.
Для этого есть много причин:
- отдельный двоичный файл почти как двойная кодовая база в том смысле, что он должен проходить полный отдельный контроль качества для каждого выпуска, и, как правило, проще отлаживать и исправлять один двоичный файл
- различные двоичные файлы могут привести к проблемам с исправлением и обновлением, и, как известно, их сложно отладить и исправить
- ваш установщик не пройдет проверку установщика Windows, если вы используете одно и то же место установки для разных файлов с одинаковыми именами. Обычно это не проблема, если вы не стремитесь получить сертификацию от Microsoft для своего установщика
- MSI неуклюж, когда дело доходит до развертывания разных версий одного и того же файла
Если вам необходимо развернуть два двоичных файла, я бы создал новый компонент с другой копией EXE-файла и установил его либо с другим именем файла, либо с тем же именем файла, но в другую папку установки. Затем вы устанавливаете взаимоисключающие компоненты с файлами для установки, используя условия установщика Windows. Это позволило бы произвести надлежащее исправление и обновление.
Комментарии:
1. Кроме того, если пользователь обновился с XP на Vista — теперь у вас установлен «неправильный» двоичный файл.
2. Это можно исправить с помощью установки «repair». Я хочу сказать, что я бы предпочел избежать сложностей, связанных с необходимостью поздней привязки DLL-файлов, чтобы мой двоичный файл мог загружаться без них в XP.
3. Хм, звучит замысловато. Я бы подумал, что есть флаги компилятора для обработки логики сборки для этого в EXE для вас, но я не уверен. Стоит задать вопрос на C ? Поскольку это связано с поведением при загрузке, возможно, будет невозможно установить EXE-файл, но Windows имеет «флаг совместимости» для двоичных файлов (см. Вкладку свойств файла в проводнике Windows, вкладка совместимости). Не могли бы вы каким-то образом включить этот флаг для принудительной загрузки или включить функцию совместимости с Windows, чтобы помочь вам избежать головной боли самостоятельно?
4. Саймон, также не забудьте установить атрибут transient для компонентов с условиями в этом случае. В противном случае восстановление может не вернуть нужный файл обратно.
5. Это была точная идея — иметь временные компоненты, которые являются взаимоисключающими и адаптированы к установленной версии Windows. Для COM-компонентов это сработало хорошо, поскольку ни ОС, ни пользователя не слишком волнует, как называется DLL (и поскольку я украл идею из SDK MSI, я думаю, что это в какой-то степени правильно); это становится затруднительным только с исполняемыми файлами, которые должны вызываться из командной строки.