CAtlServiceModuleT::ServiceMain 関数
[コントロール パネル] の [サービス] を開き、当該サービスを選択して [開始] をクリックすると、サービス コントロール マネージャー (SCM: Service Control Manager) が ServiceMain を呼び出します。
SCM が ServiceMain を呼び出すと、サービスは SCM にハンドラー関数を渡す必要があります。 この関数を使用して SCM はサービスのステータスを取得し、一時中断や停止などの特定の命令を与えます。 サービスが Win32 API 関数 RegisterServiceCtrlHandler に _Handler を渡すと、SCM がこのハンドラー関数を受け取ります。 _Handler は、静的メンバー関数であり、非静的メンバー関数 Handler を呼び出します。
サービスは、スタートアップのとき、SCM に現在のステータスを通知する必要もあります。 ステータスを通知するためには、Win32 API 関数 SetServiceStatus に SERVICE_START_PENDING を渡します。
次に、ServiceMain は Win32 API 関数 CoInitializeEx を呼び出す CAtlExeModuleT::InitializeCom を呼び出します。 既定では、InitializeCom はこの関数に COINIT_MULTITHREADED フラグを渡します。 このフラグは、プログラムがフリー スレッド サーバーになることを示します。
ここで、CAtlServiceModuleT::Run が呼び出され、サービスの主要な処理が実行されます。 Run の実行は、サービスが停止するまで継続されます。