CAtlServiceModuleT::ServiceMain 関数
更新 : 2007 年 11 月
[コントロール パネル] の [サービス] を開き、当該サービスを選択して [開始] をクリックすると、サービス コントロール マネージャ (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 の実行は、サービスが停止するまで継続されます。