Проверьте, установлена ​​ли служба Windows или нет? (С++)

Я написал службу Windows на C++, она отлично работает, теперь я хочу добавить функцию, которая при попытке установить ее может сначала проверить, установлена ​​ли она уже или нет?

Я попытался найти идеи о том, как выполнить эту задачу, но там не так много помощи. Большинство вопросов и руководств предназначены для программистов на С#, и они используют ServiceController для своей задачи, но я не могу получить доступ к какому-либо такому классу на С++.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx

приведенная выше ссылка не показывает пример для этого класса в его части примера и говорит, что:

«В настоящее время нет доступных примеров кода, или этот язык может не поддерживаться».

Дополнительная информация: Я использую 64-разрядную версию Windows 7, Visual Studio 2008, язык C++.

Любая помощь высоко ценится. Спасибо.


person B-Abbasi    schedule 26.08.2013    source источник
comment
Я сомневаюсь, что код C++ будет сильно отличаться от кода C#. Попробуйте посмотреть на пример C#, проверяя методы и свойства в C++.   -  person Some programmer dude    schedule 26.08.2013
comment
как я уже сказал, ServiceController недоступен в C++   -  person B-Abbasi    schedule 26.08.2013
comment
Может быть полезно: stackoverflow.com/questions/9868904/   -  person afree100    schedule 26.08.2013
comment
Нет, на главной странице ServiceController нет примера, но если вы посмотрите, например. статический метод GetServices вы действительно увидите действительный пример C++, что означает он поддерживается в C++/CLI и C++/CX.   -  person Some programmer dude    schedule 26.08.2013


Ответы (1)


Обновление: я оставляю ответ ниже, но на самом деле это дубликат этого, и я пометил его как таковой.

Вы должны использовать OpenService Win32 API. Он возвращает дескриптор службы или NULL, если рассматриваемая служба не существует (и GetLastError() вернет ERROR_SERVICE_DOES_NOT_EXIST; есть и другие причины ошибки, поэтому не забудьте проверить это). Кроме того, не забудьте вызвать CloseServiceHandle в случае успешного вызова. Это то, что упомянутые вами классы .NET также используют ниже.

Вы также можете посмотреть эту информацию в База данных установленных служб в реестре Windows.

В качестве альтернативы вы можете запустить внешние команды (например, sc.exe или Powershell) из вашего установщика, которые запрашивают эту информацию.

person Christian.K    schedule 26.08.2013