4

C++ を使用してローカル サービス アプリケーションを作成していますが、シャットダウン前の通知を登録する正しい方法が見つかりません (Windows XP 以降の OS の場合)。Vista以降にSERVICE_CONTROL_PRESHUTDOWN通知が追加されたと思いますが、SetServiceStatusを呼び出すときに次を指定する必要がありますか?

dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PRESHUTDOWN;

また

dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PRESHUTDOWN;
4

4 に答える 4

10

サービスが正しくコーディングされている場合、シャットダウンとプレシャットダウンの両方を受け入れることはできません。ドキュメントには、これが明示的に記載されています。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspxから:

参照SERVICE_CONTROL_PRESHUTDOWN:

この通知を処理するサービスは、サービスが停止するか、SERVICE_PRESHUTDOWN_INFO で指定されたプレシャットダウン タイムアウト間隔が経過するまで、システムのシャットダウンをブロックします。

同じページで、セクションに関するセクションに次の情報SERVICE_CONTROL_SHUTDOWNが追加されています。

SERVICE_CONTROL_PRESHUTDOWN 通知に登録するサービスは、既に停止しているため、この通知を受信できないことに注意してください。

したがって、正しい方法は、必要に応じてまたはのdwControlsAcceptedいずれかを含めるように を設定することですが、同時に両方を含めることはできません。SERVICE_ACCEPT_SHUTDOWNSERVICE_ACCEPT_PRESHUTDOWN

ただし、より多くのコントロールを受け入れる可能性があることに注意してください。後者がないと、サービスを停止できず (ソフトウェアをアンインストールするなど)、プロセスを強制的に終了 (つまりkill )する必要があるため、常に少なくとも を許可する必要がSERVICE_CONTROL_INTERROGATEあり、ほぼ確実に許可する必要があります。SERVICE_CONTROL_STOP

于 2012-11-11T09:38:06.583 に答える
0

これらの 2 つの通知は、ドキュメントから取得したように異なるようです。サービスがプレシャットダウン通知を受信できるようにすることが本当に必要な場合はdwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PRESHUTDOWN;、次のオプションを使用する必要があります。

于 2012-11-11T08:14:06.813 に答える