選択してプロジェクトを作成します。生成されたクラスとその概要サービスプログラムの制御に関係するメソッドは次のもののようです。CServiceModule::StartCServiceModule::ServiceMainCServiceModule::RunCServiceModule::HandlerCServiceModule::LogEventこれらの関数が用意されていて、役割は次のようになります。CServiceModule::Start()サービスのスタートアップおよび登録。プログラマーが特に意識する必要はなさそうです。lpszArgv)コントロール要求ハンドラの登録と、メインループの実行。プログラマーが特に意識する必要はなさそうです。関数が呼び出されて、サービスプログラムのメイン処理が開始されることになるようです。CServiceModule::Run()サービスのメイン実行ルーチン。この中でサービスが初期化され、メッセージループが開始されるようです。このループはサービスを停止するまで持続されます。いった指示を受け取るための関数です。サービスコントロールマネージャからの通知を受け取り、それにあった処理を実装する必要があります。不明なコード以外は、新規作成直後には何の関数も呼び出さないようになっていますので、必要な機能を書き加える必要があります。不明なコードが検出された場合には、ディフォルトではイベントログへの書き出しになっているようです。...)イベントログへメッセージを書き出すようです。処理を追記すべき場所を探すとりあえずデバッガを使って、サービスの機能を実装したらいいかを調べてみることにします。関数の最初の行にブレークポイントを設定してみることにしましたが、デバッグモードからは呼び出されないのか、ブレークポイントで停止してくれませんでした。関数の最初の行にブレークポイントを設定して実行してみると、ちゃんとブレークポイントに到達しました。深追いすることなくステップオーバーで一通り進んでみると、この関数内の最後のほう、次のようなプログラムの部分でループを繰り返しているようです。メッセージを取得するまで待つようです。取得したメッセージをそのまま再送しているようです。プログラムのひとつとして正常に機能するように調整されているようです。ループ内で、メッセージループに支障をきたさない程度に実装するか、またはその直前あたりで別スレッドを立てるのがよさそうです。使ったループに切り替えるかですけど。音でも鳴らすサービスを作成してみましょうか...。ループの中へ、システムビープを鳴らすためのコードを書き加えてみることにしました。関数内の最後のほうです。呼び出してあげるだけです。関数の待ちのため、システムビープはなりませんでした。ループの手前ならば音が鳴るので、メッセージがそう届くものではないようです。なるとやはり、別スレッドによる処理のほうが都合がいいのかもしれませんね。メッセージを発生させてみることにします。発生するようにしてみます。インスタンスとして追加しておきました。これをつかってタイマーを特定します。発生するため、ちゃんとそれにあわせてシステムビープがなるようになりました。特定の関数を呼び出すように指定することができるようなので、実際にちゃんとしたプログラムを組む場合にはそのようにしたほうがよさそうですけどね。基本機能の実装ができたので、今度は制御機構のコーディングをしてみます。実装するだけという簡単なものですけど。サービスとして登録するとりあえずコードが書けたら、コントロールパネルのサービスとして登録してみます。表記された下のエディットボックスに、登録コードがあります。/Serviceにすることで、次のビルドからはローカルサーバではなくサービスとして登録されます。開いて、登録したサービスを起動してみます。すると今回の場合、ちゃんと、一秒刻みでシステムビープがなり始めました。停止させればシステムビープもやみます。以外の機能は利用できないみたいですね...。関数にてなにやら初期状態を決定しているようです。メンバ変数への設定です。構造体のインスタンスで、メンバーの意味は次のようになるようです。dwServiceTypeサービスの種類です。SERVICE_WIN32_OWN_PROCESSdwCurrentStateサービスの初期状態です。SERVICE_STOPPEDdwControlsAccepted受け入れるハンドラです。SERVICE_ACCEPT_STOPdwWin32ExtCode起動中または停止中に起こったエラーを報告するためのエラーコードです。0dwServiceSpecificExitCodeこれもエラーを報告するためのコードらしい...。0dwCheckPoint進行状況を伝えるための値らしい...。0dwWaitHintサービスの開始や停止にかかる時間の指標をミリ秒単位で指定するそうです...。値を調整すればよさそうですね。次のようにすることで、中断や続行といった機能を持たせることができそうです。選択肢に入るようになりました。コードの実装が甘かったようで、エラーとなってしまいましたが。関数をハンドラで呼び出していないのが原因のような気がします。とりうる引数を調べてみたところ、次のようなものをとるようです。SERVICE_CONTINUE_PENDINGサービスの再開手続き中を意味します。SERVICE_PAUSE_PENDINGサービスの停止手続き中を意味します。SERVICE_PAUSEDサービスの停止中を意味します。SERVICE_RUNNINGサービスの稼動中を意味します。SERVICE_START_PENDINGサービスの起動中を意味します。SERVICE_STOP_PENDINGサービスの停止中を意味します。SERVICE_STOPPEDサービスの停止を意味します。渡すことで、現在の状態を通知することができるようです。設定すればいいという感じでしょうか。部分を次のように変えてみます。m_timer);SetServiceStatus(SERVICE_PAUSED);break;このようにしてみると、ちゃんと一時停止を行うことができるようになりました。行を消してみるとやはり失敗。方をけしてみると、この場合はとりあえずエラーになるということはないようです...。移るようにコーディングしてやればよさそうです。タイミングが今ひとつわからなかったです。あたりを実装できるのでよしとしておくことにします。多く容量がもらえます。多く容量がもらえます。