Я имею дело с круговой зависимостью w.r.t. служба Windows и ее зависимость от водителя. Ситуация такова:Как определить эту зависимость при установке службы
Я написал службу Windows на C++. Эта услуга зависит от DLL, которая устанавливает драйвер при первом загрузке/использовании; DLL использует драйвер во время работы с этого момента.
В начале тестирования я установил бы службу через вызов командной строки в исполняемый файл службы с флагом /INSTALL
- это вызвало бы внутреннюю связь InstallService
.
Затем я столкнулся с проблемой: служба запускается, когда я запускаю ее вручную, но когда она была запущена автоматически после загрузки, она запускалась до того, как драйвер был загружен, и из-за этого будет ошибкой.
Чтобы исправить это, я установил зависимость для службы в драйвере - Windows относится к драйверам, подобным сервисам, - в записи реестра службы @HKLM\System\CurrentControlSet\Services\<SERVICE>
в значении DependOnService
. Это исправило эту проблему.
Быстрый переход к развертыванию: я использую WiX для установки и запуска службы. Во время установки я хочу установить драйвер в качестве зависимости от моего сервиса. Однако, если я определяю драйвер как зависимость в элементе ServiceInstall
, то WiX пытается запустить его перед запуском службы, поэтому моя проблема: WiX не может запустить службу, не запустив зависимость, и зависимость не существует, потому что служба еще не запущена.
Если я не укажу зависимость в файле конфигурации установщика, служба будет установлена и работает нормально.
Я решил, что я могу определить зависимость после установки службы в реестре, как раньше, но там нет записи для службы!
Другое дело: сервис запускается после загрузки сейчас! Без определения зависимости! Я не проводил много испытаний, чтобы убедиться, что это согласовано или нет.
Итак, как WiX сообщает Windows, что есть служба, то есть почему нет записи в реестре? Как указать зависимость? Do I даже need чтобы указать его больше? Должен ли я отказаться от использования элементов, связанных с WiX-сервисом, и запустить команды, которые я выполнял во время тестирования вручную в программе установки?
Я боролся с этим и исследовал, по крайней мере, неделю; любое понимание было бы оценено.
Окружающая среда Информация:
- Разработка: Windows 7, 32-разрядная
- Visual Studio 2010
- WiX v3.8
- Развертывание: Windows 7, 32-разрядная и 64-бит - ТАМОЖЕННЫЕ, ИЗОБРАЖЕННЫЕ ИЗОБРАЖЕНИЯ так что-то стоять ard, возможно, нет
Я понимаю вашу проблему, однако то, что я не понимаю, является частью «Я написал службу Windows на C++. Эта служба зависит от DLL, которая устанавливает драйвер при первом загрузке/использовании, DLL использует во время операции с тех пор ». - звучит как очень плохой дизайн, который вызывает у вас много проблем. Запуск службы не должен запускать какой-либо процесс установки. Почему вы так поступили? Я бы сказал, избавиться от любых установок, которые выполняет ваша служба, и начать использовать полные возможности WiX. –
Также WiX пытается запустить вашу зависимость, звучит неправильно. Это не должно начинать ничего. Необходимо только установить необходимый драйвер/DLL, от которого зависит ваш сервис. Вот и все. –
@ChrisEelmaa Извините, что часть была неясной, возможно, я могу уточнить: в DLL есть файл драйвера .sys. В первый раз, когда используется DLL, если этот файл .sys отсутствует в системе, DLL распаковывает его и записывает на диск - он не запускает другой установщик или что-то еще. Выбор делать так не был моим, а авторами третьей стороны DLL. Я предполагаю, что могу получить файл '.sys' из системы, на которой он уже установлен, и установить WiX в нужное место; Я должен посмотреть на это. – paul