Skip to main content.

Thursday, August 10, 2006

Windowsサービスプログラム

Windowsサービスプログラムとは、常駐型のプログラムで、UNIX系ではデーモンといわれるプログラムのことです(WEBサービスとは別です)。コントロールパネルからたどって、管理ツールの「サービス」の一覧(SCM:サービスコントロールマネージャ、以下SCM)に登録されているプログラムといった方が分かりやすいでしょうか。

このサービスプログラムは、通常、WEBサーバ、メールサーバなどのサーバプログラム、スケジュール機能、監視機能などの常時稼動している必要がある機能を持ったプログラムとなります。サービスプログラムに必要な機能としては、先に述べた常時稼動している必要のあるプログラム本体の機能とは別に、少なくとも、SCMに登録、SCMから削除する機能、SCMからの操作を受け付ける機能(ハンドラ)が必要となります。(より詳細は参考サイト1が参考になるかと思います。)

今回は、簡単なサービスプログラムのサンプルを作成しました。作り方はいろいろとありますが、(その方法は、参考サイト2が参考になるかと思います。)今回は、一番基本的なVC++でWin32APIを利用した作り方です。といいましても、元々はMSDNのサンプルプログラムそのものです。このサンプルプログラムは、名前付きパイプで通信するサーバとクライアントのプログラムで、サーバ部分がサービスとなっていて、クライアントプログラムも別にあるというプログラムです。これをもっと簡単にいわいるHelloWorld的なプログラムにしました。機能としては、開始すると、5秒おきに"Hello World!!"と画面にメッセージを表示します。

サンプルの使い方は、以下になります。
・ビルドして、serviceHello.exeを作成する。
・コマンドラインから "serviceHello -install"と実行する。
・SCMに登録(サービス名:Hello World Service)されたことを確認する。
・SCMから開始する。
・画面に出るメッセージを確認する。
・SCMから停止をする。メッセージが止まります。
・SCMから削除する場合は、 "serviceHello -remove"と実行します。



ソースを掲載すると長くなるので、必要な場合はお手数ですが、ソースはプロジェクト全体をダウンロードしてご覧ください。使用している主なAPIは以下になります。
SCMへの登録、削除
OpenSCManager()
CreateService()
DeleteService()
CloseServiceHandle()

SCMからの操作
SetServiceStatus()
QueryServiceStatus()
ControlService()

イベントログ
RegisterEventSource()
ReportEvent()

VC++ 6.0のプロジェクトファイルは以下に置きました。
プロジェクト一式
動作確認はしましたが、動作は保証できません。このプログラムを利用しての不具合、不利益には一切の責任を負いかねます。ご了承ください。

参考サイト1
Windows NT サービスの作り方

参考サイト2
サービスを作成する方法

参考サイト3
Windows サービス アプリケーション(MSDN)


Windowsプログラミング関連記事