1

サービス MMC から SERVICE_CONTROL_STOP を受信した直後に停止できないことがあるサービス アプリケーションを作成しています。私は現在、次のように処理しています:(疑似コードで):

DWORD 
HandlerEx(
    DWORD dwControl, 
    DWORD dwEventType, 
    PVOID pvEventData, 
    PVOID pvContext
) 
{
    switch( dwControl )
    {
    case SERVICE_CONTROL_STOP:
        if ( CanStopServiceNow() )
        {
             ReportStatus( SERVICE_STOP_PENDING );
             DoStopService();
             ReportStatus( SERVICE_STOPPED );
             return NO_ERROR;
        }
        else
             return ERROR_BUSY;
        break;
    }

    return NO_ERROR;
}

サービスが停止できる場合 (実際に停止する場合) は問題なく動作しますが、停止できない場合は、Windows が返すエラー (この例では ERROR_BUSY) を報告することを期待します。代わりに、Windows は次のようなメッセージを表示します。

"The service did not return an error. 
This could be an internal Windows error or an internal service error." 

私の質問は、サービスが現在停止できないことを SCM に報告し、MMC に返された実際のエラー コードに関するメッセージを表示させる方法です。

4

2 に答える 2

1

これがあなたの特定の質問に答えないことは承知しています。でも、答えは「仕方がない」と思います。とにかく提案します。起動とシャットダウンをより詳細に制御する必要があるほとんどのアプリケーションは、Sap と Oracle を思い浮かべることができます。Windows サービスを管理サービスとして使用し、GUI またはコマンド ライン インターフェイスを実装して実際の「ワーカー プロセス」を起動および停止します。

于 2008-11-15T22:51:34.377 に答える
1

私自身の質問に答えます (問題をより詳細に調査した後): HandlerEx 関数からエラー コードを返す代わりに、サービスはそのステータスを SCM に報告して、SERVICE_CONTROL_STOP コードを受け入れることができるかどうかを示す必要があります。サービスがすぐに停止できないことを検出した場合、SERVICE_STATUS 構造体の SERVICE_ACCEPT_STOP ビットをクリアし、SetServiceStatus() を呼び出す必要があります。これにより、SCM が最初にサービスを停止しようとするのを防ぐことができます。この状態が解消され、安全に停止できるとサービスが判断した場合、サービスは SERVICE_ACCEPT_STOP ビットを設定し、SetServiceStatus() を再度呼び出す必要があります。

于 2008-11-17T18:14:55.447 に答える