0

を使用してwindows serviceアプリケーションを作成しました。関数内で、本体に次のコードが含まれる別の関数を呼び出します: :C++Visual Studio 2013main()

SERVICE_TABLE_ENTRY SerTable[] =
    {
        { const_cast<char *>(ServiceName.c_str()), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
        { NULL, NULL }
    };
    int res = StartServiceCtrlDispatcher(SerTable);
    if (res == 0)
    {
        DEBUG_LOG(ServiceName+":StartServiceCtrlDispatcher failed", GetLastError());
        return QERROR;
    }

私の main() 関数にも含まれていますsystem("start notepad");

プログラムを正常にビルドでき、実行可能ファイルが生成されます。OpenSCManager()今、私は、を使用して別のプログラムからこのexeを開こうとしていCreateService()ます. これにより、サービスが作成され、下に一覧表示されServices.mscます。右クリックしてサービスを開始すると、 のように表示statusされstartedます。しかし、何も起こりません..

my をダブルクリックすると、次exeのメッセージが表示され、error 1063: StartServiceControldispatcher Failedメモ帳が開きます。

でサービスを起動するとメモ帳が開かないのはなぜServices.mscですか?

4

1 に答える 1

1

ServiceMainnotからメモ帳を起動する必要がありますmainServiceMainは、OS によってサービスが開始されたときに呼び出される関数であるため、system("start notepad")呼び出しをServiceMain.

詳細説明

OP によるコメントへの応答として - 現在発生しているエラーは 1063 またはERROR_FAILED_SERVICE_CONTROLLER_CONNECT. StartServiceCtrlDispatcherのドキュメントでは、次のように説明されています。

このエラーは、プログラムがサービスとしてではなくコンソール アプリケーションとして実行されている場合に返されます。

そのため、ダブルクリックで実行可能ファイルを起動するとエラーが発生します - コンソール アプリとして起動しています。(コントロール パネル、コマンド プロンプト、または WinAPI のいずれかから) サービスを適切に起動すると、この関数は成功します。

サービス コントロール マネージャーは、サービス プロセスを開始すると、プロセスが StartServiceCtrlDispatcher 関数を呼び出すのを待ちます。サービス プロセスのメイン スレッドは、起動後できるだけ早く (30 秒以内)、この呼び出しを行う必要があります。StartServiceCtrlDispatcher が成功すると、呼び出しスレッドをサービス コントロール マネージャーに接続し、プロセスで実行中のすべてのサービスが SERVICE_STOPPED 状態になるまで戻りません。サービス コントロール マネージャは、この接続を使用して、サービス プロセスのメイン スレッドに制御およびサービス開始要求を送信します。メイン スレッドは、適切な HandlerEx 関数を呼び出して制御要求を処理するか、新しいサービスの開始時に適切な ServiceMain 関数を実行する新しいスレッドを作成することにより、ディスパッチャーとして機能します。

はい、適切な起動後ServiceMainに呼び出されます。

于 2015-07-23T12:16:38.803 に答える