У меня была такая же проблема, как и у вас. У меня есть системная служба, которую я хочу удалить, а затем переустановить как часть обновления. На некоторых системах это не будет работать без перезагрузки. Проблема заключалась в том, что вызов DeleteService () возвращался бы нормально, но следующий вызов CreateService () сказал бы, что служба все еще там, но помечена для удаления (код ошибки 1072). Реестр будет отражать это, так как подраздел все еще там (в разделе HKLM \ System \ CurrentControlSet \ Services), но для «DeleteFlag» установлено значение 1. С этого момента только перезагрузка может исправить ситуацию.
Некоторые вещи, которые не работают:
- Использование "sc delete": у него были те же проблемы, что и у меня. Вызов вернется нормально, но служба не исчезла и все еще находится в реестре с DeleteFlag = 1.
- Удаление ключа в реестре. Диспетчер служб, похоже, хранит базу данных в памяти, а реестр является лишь копией для следующей загрузки.
- Добавление циклов ожидания, ожидание готовности файлов .exe к перезаписи, уничтожение процесса и т. Д.
- Закрывающие ручки к сервису. Какие из них ??
Но вот что сработало:
В некоторых статьях, посвященных stackoverflow, я заметил, что net.exe также имеет функции запуска / остановки (я знал только об утилите sc.exe). И как ни странно, «net stop svcname» плюс «sc delete svcname» сработали! Поэтому net.exe должен делать то, чего я не делаю.
Но net.exe не содержит импорта в ControlService (), так как он останавливает службу? Я обнаружил, что net.exe порождает net1.exe, но net1.exe также не импортирует ControlService (). Я использовал замечательную утилиту API Monitor (http://www.rohitab.com/apimonitor), чтобы увидеть, что делает net1.exe, но она никогда не вызывала ничего, что выглядело многообещающе.
Но потом я увидел, что он импортирует NetServiceControl () из NETAPI32.DLL (в названии которого было хотя бы "Service"!). MSDN говорит, что эта функция устарела. Тем не менее, я нашел прототип в LMSvc.h и описание некоторых параметров здесь: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html. Когда вы загружаете NETAPI32.DLL и используете NetServiceControl(NULL, service_name, 3, 0, 0)
(3 для SERVICE_CTRL_UNINSTALL, который используется для остановки), сервис останавливается впоследствии. И это может быть удалено и переустановлено впоследствии без DeleteFlag или перезагрузки!
Так что это никогда не было проблемой удаления, а правильной остановки службы. И NetServiceControl () делает свое дело. Извините за длинный пост, но я подумал, что это может помочь кому-то с подобными проблемами. (Просто для справки, я использую Win7 SP1 x64.)