J'avais en quelque sorte le même problème que vous. J'ai un système de service que je veux le désinstaller et le réinstaller par la suite dans le cadre d'une mise à jour. Sur certains systèmes, cela ne pourrait pas fonctionner sans un redémarrage. Le problème était qu'un appel à DeleteService() serait de retour ok, mais l'appel suivant à CreateService() me dire le service était toujours là, mais marqués pour suppression (code d'erreur 1072). Le registre permettrait de refléter le fait que, depuis la sous-clé était toujours là (dans HKLM\System\CurrentControlSet\Services), mais "DeleteFlag" a été fixé à 1. À partir de ce moment, seul un redémarrage pourrait remédier à la situation.
Certaines choses qui ne fonctionnent pas:
- À l'aide de "sc delete": il avait les mêmes problèmes I. de L'appel serait de retour ok, mais le service n'était pas vraiment disparu et toujours dans le registre avec DeleteFlag = 1.
- La suppression de la clé dans le registre. Le Gestionnaire de Service semble garder une base de données dans la mémoire et le registre est juste une copie de celui-ci pour le prochain démarrage.
- L'ajout d'attendre des boucles, en attendant .les fichiers exe être prêt à être écrasé, tuant le processus, etc.
- Poignées de fermeture du service. Lesquels??
Mais voici ce qui a fonctionné:
J'ai remarqué dans certains articles ici sur stackoverflow que net.exe a start/stop fonctions (je ne connaissais que de sc.exe de l'utilité). Et, assez étrangement, un "net stop svcname" plus un "sc delete svcname" travaillé! Donc net.exe doit faire quelque chose que je ne fais pas.
Mais net.exe ne contient pas une importation ControlService(), alors, comment est-il arrêter le service? J'ai trouvé que net.exe engendre net1.exe mais net1.exe ne pas importer la ControlService() ainsi. J'ai utilisé le grand API Monitor utility ( http://www.rohitab.com/apimonitor pour voir à ce que net1.exe le fait, mais il ne s'est jamais appelé tout ce qui avait l'air prometteur.
Mais ensuite j'ai vu qu'il importe NetServiceControl() à partir de NETAPI32.DLL (qui avait au moins le "Service" dans son nom!). MSDN dit que cette fonction est obsolète. Néanmoins, j'ai trouvé le prototype de l'LMSvc.h et certains paramètre description ici: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html . Lorsque vous chargez NETAPI32.DLL et utiliser NetServiceControl(NULL, service_name, 3, 0, 0)
(3 est pour SERVICE_CTRL_UNINSTALL, qui est utilisé pour arrêter) le service est arrêté par la suite. Et il peut être supprimé et réinstallé par la suite sans DeleteFlag ou reboot!
Donc, il n'a jamais été un problème de la suppression, mais de l'arrêt du service correctement. Et NetServiceControl() fait le tour. Désolé pour le long post, mais j'ai pensé qu'il pourrait aider quelqu'un avec des problèmes similaires. (Juste pour la référence, j'utilise Win7 SP1 x64.)