2014-10-09 4 views
0

Я имею дело с круговой зависимостью 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, возможно, нет
+0

Я понимаю вашу проблему, однако то, что я не понимаю, является частью «Я написал службу Windows на C++. Эта служба зависит от DLL, которая устанавливает драйвер при первом загрузке/использовании, DLL использует во время операции с тех пор ». - звучит как очень плохой дизайн, который вызывает у вас много проблем. Запуск службы не должен запускать какой-либо процесс установки. Почему вы так поступили? Я бы сказал, избавиться от любых установок, которые выполняет ваша служба, и начать использовать полные возможности WiX. –

+0

Также WiX пытается запустить вашу зависимость, звучит неправильно. Это не должно начинать ничего. Необходимо только установить необходимый драйвер/DLL, от которого зависит ваш сервис. Вот и все. –

+0

@ChrisEelmaa Извините, что часть была неясной, возможно, я могу уточнить: в DLL есть файл драйвера .sys. В первый раз, когда используется DLL, если этот файл .sys отсутствует в системе, DLL распаковывает его и записывает на диск - он не запускает другой установщик или что-то еще. Выбор делать так не был моим, а авторами третьей стороны DLL. Я предполагаю, что могу получить файл '.sys' из системы, на которой он уже установлен, и установить WiX в нужное место; Я должен посмотреть на это. – paul

ответ

1

Я нашел решение.

Большая часть выпуска была проблема RTFM (хотя на мою защиту документации не все, что понятно):

Я использовал общее имя для значения атрибута ServiceInstall элемента Name - I было установлено, что это было использовано для связывания элемента ServiceInstall с элементом ServiceControl.

документация для ServiceInstall элемента говорит следующее об атрибуте Name:

Этот столбец является строка, которая содержит имя службы для установки.

документация для ServiceControl элемента говорит:

Имя службы.

Фактическое использование для значения атрибута Name - это скрытое системное имя службы; это имя, используемое в реестре под HKLM\System\CurrentControlSet\Services. Таким образом, моя служба была установлена ​​под ключом ServiceManagement, так как это то, что у меня было в атрибуте Name.

Другое название - это то, что заставляло работу работать зависимо. Видимо, запрещая зависимости, Windows загружает сервисы в алфавитном порядке (см. Комментарии к this answer). Когда я устанавливал вручную, моя служба имела имя, которое было раньше, чем у драйвера, поэтому было ошибкой, когда зависимость не была указана. Общее имя, указанное в атрибуте Name проекта WiX, получило после имя службы драйвера, поэтому драйвер загружался до моего обслуживания.

Что я в итоге сделал, это переключение Name назад в соответствующее имя службы, а затем добавление RegistryValue в проект WiX, чтобы указать зависимость моего сервиса от драйвера (службы).

Смежные вопросы