Windowsサービスの作り方講座 その0

えーと、去年仕事で、Windowsサービスとして動くプログラムを見たり作ったりしたんだけども、それまでよく知らなかったんだよね、Windowsサービス。常駐型のプロセスとして動いて、UIとかがないぐらいしか知らなくて、どうやって作って、どうやって仕事するのかサッパリだった。でも、やってみると案外簡単にできちゃったので、ここで自分の理解を確かめつつ、整理する為に、作り方を書いてみようかなと、思う。

で、だ。まず、具体的に作り方を書いていく前に、Windowsサービスってどんな様式のプログラムなのか、どんな制約があって、何ができるのかを、作る前にもっていた疑問に答える形で書いてみようと思う。Windowsのプログラム書き始めて日が浅い人とか、きっと同じ疑問を持っていると思うので。

Windosサービスってどんなプログラム?

さっきもちょっと書いたけど、常駐型のプログラムでユーザインタフェース(UI)を持たないプログラム。UIをサービスプログラムのロードモジュールの中に入れようと思えば入れられるんだろうけど、一般的ではないと思う。なんでかというと、ユーザがログオンする前の時点で、Windowsによって起動されるプログラムがWindowsサービスだから。UIで対話するユーザが誰もいない時に動くプログラムなので、UIは持つ必要がない。でも、ユーザがいない時点で動いていなきゃいけないけど、ちゃんと動いているのか、所定の動作をしているのか確認したり、特別な機能を作動させる指示を出す時がある、なんてのなら、人とWindowsサービスとの間を取り持つやりかたを考えればいい。もうちょっと具体的に言うと、ユーザの指示・要求を受け入れるUIを持ったプログラムはWindowsサービスになるプログラムとは別に作って、2つのプログラムの間をプログラム間通信で接続すればOK。この後、実装例を示していくけど、そこまでちゃんと実装していく予定です。

ここまでをちょっと箇条書きにしてみる。Windowsサービスってどんなプログラムかというと。

  • Windowsが起動した時、ユーザログオンより前の時点でWindowsによって起動されるプログラム*1
  • ユーザログオンより前に動くのでUIを持たない。
  • ユーザとの対話はUIだけをやるプログラムを作って、UIプログラムとWindowsサービスの間をプログラム間通信で結んで実現。

こんな感じ。サーバで運用するプログラムなんかは、こーゆーのが多くなってきているはず。ちょっと前までは自動ログオンの設定をして、ログオン時のスタートアップで起動させるようにしてタスクトレイに収まるようにするなんて実装が多かったと思う。でも、セキュリティにかかわる懸念が高まっている昨今、自動ログオンさせることをいやがるお客様も増えてきている。こーゆー時、この手をプログラムをWindowsサービスにしなきゃいけなくなるんだけど、「えー、Windowsサービスってどうやって書けばいいの?」とかなっちゃうわけです。そこの疑問になんとか答えていければなあと。

これからの段取りと前提

さて、ここでちょっとこれからの段取りを考えてみる。

  • Visual Studio 2008を使ってからっぽのテンプレートを生成する。
  • テンプレートで生成された部分の説明。
  • テンプレートだけだと動かないので、動くまでに必要な追加の作業の説明。
  • まず、動かしてみる。
  • メインルーチンとして動く機能を実装する。
  • テスト・デバッグのやり方の説明。
  • UIプログラムとプログラム間通信を実装する。

あと、前提。うちのテストマシンは64bit Windows 7で、Visual StudioのエディションはTeam System Development Editionだったりするので、他のエディションではできない事があったりするかもしれません。あと、ランゲージはVBです。C#erはこんな初歩的な事疑問に思ったりしないからいいよね!ということでC#は使いません。あしからず。

ということで、長い前置き終了。次のエントリで実際に作りをやってみます。

蛇足:あー、そういえば仕事ではWindows XP Professional 32bitでやったんだった。VS2005で。ひょっとするとどこかにとんでもない罠があって、ドはまりするかもしれないなw ご期待下さいww

*1:正確には手動で指示するまで起動しない設定もあるけど、それはどっちかというと例外的な運用ではないかと思うので、デフォルトはこっちだとして扱います。ひとまず。