Попытка запустить встроенный инструмент из WIX msi для выборочной установки

В основном я пытаюсь создать WIX msi, который может запускать devcon.exe (версия командной строки диспетчера оборудования Windows), чтобы определить, установлено ли определенное оборудование. Если это так, установите msi A, иначе установите msi B (A и B уже существуют как отдельные пакеты msi, нам нужна автоматическая выборочная установка на основе оборудования).

В настоящее время я установил WIX SDK и создал проект WIX, который правильно создает файл msi. Я могу делать простые вещи, например выполнять CustomActions, чтобы открыть notepad.exe, и такие простые вещи.

1-я проблема: у меня возникли проблемы с поиском того, как упаковать файл в установщик, который не будет установлен в каталог. Я нашел ссылки на это, но нигде не указано, как это сделать. Мне не нужно помещать его в теги «Каталог», если он не будет установлен на главный диск, верно?

Вторая проблема: devcon.exe (из того, что я могу сказать, поправьте меня, если я ошибаюсь), похоже, не меняет возвращаемое значение в зависимости от того, что он находит, вероятно, потому, что он делает так много вещей и не ограничивается тем, аппаратное устройство существует или нет. Поэтому, если я смогу встроить его и заставить его работать, мне нужно каким-то образом перенести то, что он выводит, в стандартный поток вывода, а затем проанализировать его на предмет конкретных значений, которые я ищу.

Конечно, это было бы немного проще, потому что у меня уже есть командный файл, который может выполнять синтаксический анализ и устанавливать переменную среды, которая сообщит мне, что мне нужно знать, но, если я могу встроить их оба, как мне получить командный файл для ссылки на встроенный devcon.exe, а затем заставить WIX читать переменную, или, возможно, я могу настроить его (или свойство) в WIX, а затем установить его из командного файла?

Может, мне лучше вместо этого создать настраиваемое действие dll? Можно ли запустить встроенный исполняемый файл из настраиваемого действия dll? Затем я мог бы запустить devcon.exe и провести там весь анализ, а затем просто установить переменную Wix или свойство, чтобы выбрать, что делать дальше.

3-я проблема: возможность запускать один msi из другого. Я еще не совсем в этом, но я нашел (http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html), который выглядит многообещающим, хотя я еще не прочитал все это пока что. По одной проблеме за раз, меня уже наверняка хватит :)


person NaimK    schedule 11.01.2012    source источник


Ответы (2)


Хорошо, первая проблема решена:

<Binary Id="Devcon" SourceFile="D:\Programming\Device_Selection\Device_Selection\devcon.exe"/>
<CustomAction Id="RunDevcon" BinaryKey="Devcon" ExeCommand="resources *vendor*device*" Return="check" Execute="deferred" Impersonate="no" />

Это гарантирует, что инструмент devcon.exe встроен в установщик и что я могу запустить его в режиме администратора (который не будет работать, если вы не укажете Impersonate на «no» и Execute на «deferred»).

Следующее, что мне нужно сделать, это прочитать вывод, который devcon обычно отправляет на консоль (например, окно cmd), а затем проанализировать его для получения информации. Есть ли способ записать этот вывод?

person NaimK    schedule 12.01.2012

Для второй проблемы я бы создал настраиваемое действие EXE или DLL, которое запускает devcon.exe, считывает его вывод и анализирует его. Сам devcon.exe можно хранить в ресурсах EXE / DLL и извлекать во временный каталог перед запуском, а затем вы удалите его, когда закончите с ним.

Если вы выберете DLL, вы можете изменить общедоступные свойства MSI. Таким образом, вы можете установить свойство, которое будет контролировать дальнейшие действия в MSI.

Если вы выберете EXE, у вас будет только код выхода. Насколько я знаю, в MSI с этим мало что можно сделать.


Не рекомендуется связывать установки MSI в цепочку. Вы можете встроить оба драйвера в один пакет и выбрать компоненты для установки в зависимости от свойства, установленного в результате обнаружения devcon.exe.


Другой подход - создать загрузочный EXE, который запускает devcon.exe и определяет, какой пакет установить. Затем он просто устанавливает правильный пакет MSI.

person Alexey Ivanov    schedule 12.01.2012