私はあなたと同じような問題を抱えていました。アンインストールしてから、アップデートの一部として再インストールしたいシステムサービスがあります。特定のシステムでは、これは再起動しないと機能しません。問題は、DeleteService()を呼び出すとokが返されることでしたが、次のCreateService()を呼び出すと、サービスはまだ存在しているが、削除のマークが付けられていることがわかります(エラーコード1072)。レジストリは、サブキーがまだそこにあるため(HKLM \ System \ CurrentControlSet \ Servicesの下)、「DeleteFlag」が1に設定されていることを反映します。その時点から、再起動するだけで状況を修正できます。
動作しないもの:
- 「scdelete」の使用:Iと同じ問題が発生しました。呼び出しはokを返しますが、サービスは実際にはなくなっておらず、DeleteFlag=1のレジストリに残っています。
- レジストリ内のキーを削除します。Service Managerはデータベースをメモリに保持しているようで、レジストリは次回の起動のためにデータベースのコピーにすぎません。
- 待機ループの追加、.exeファイルの上書き準備の待機、プロセスの強制終了など。
- サービスへのハンドルを閉じます。どれ??
しかし、これがうまくいったことです:
私はここstackoverflowに関するいくつかの記事で、net.exeにも開始/停止機能があることに気づきました(私はsc.exeユーティリティしか知りませんでした)。そして不思議なことに、「netstopsvcname」と「scdeletesvcname」が機能しました。したがって、net.exeは私が行わないことを実行する必要があります。
しかし、net.exeにはControlService()へのインポートが含まれていないので、どのようにしてサービスを停止しますか?net.exeがnet1.exeを生成することを知りましたが、net1.exeはControlService()もインポートしません。優れたAPIモニターユーティリティ(http://www.rohitab.com/apimonitor)を使用してnet1.exeの動作を確認しましたが、有望と思われるものは呼び出されませんでした。
しかし、それから、NETAPI32.DLL(名前に少なくとも「Service」が含まれている!)からNetServiceControl()をインポートすることがわかりました。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を使用しています。)