Windows サービスあれこれ (1)

こんにちは、Platform SDK (Windows SDK) サポートの tomoshi です。
先日、Credential Provider の記事を書かれた mitsuruw さんと同じく、主に Windows のベース テクノロジーに関連したプログラミングのサポートを担当しています。
一口に “Windows のベース テクノロジー” と申しましても、間口も奥行きも広大なテクノロジー エリアなのですが、中でも Windows サービスやイベント ログ、タスクスケジューラやパフォーマンス カウンタ関連のプログラミングを担当しています。
どうぞよろしくお願いいたします。

今回は、Windows サービスを開発される際に、是非ご活用いただきたいサンプル プログラムについて、ご案内させていただきます。
今回は、と申しておきながら、シリーズ物になりそうな予感です・・・!
どうぞお付き合いくださいませ。

 

ご存じのとおり、Windows サービスというプログラムは、様々な言語で開発していただくことが可能です。
ATL や .NET Framework のプロジェクトの場合、Visual Studio のプロジェクト ウィザードから ”Windows サービス” という項目を選ぶと、Windows サービスのプロジェクトをすぐに作成することが可能です。

  •  ATL
  • .NET Framework の C# や VB.NET
  • Native の C/C++

ところが・・・Native の C/C++ のプロジェクトの場合は、残念ながら “Windows サービス” のテンプレートが用意されていません。
ATL も .NET Framework も利用しない、Native な Windows サービスを使って、今すぐ早急にテストをする必要がある時など、これは不便ですよね。

そんな時、是非ご利用いただきたいのが、Windows SDK から提供されている simple サービス サンプルです。 

パスはこちら:   \Microsoft SDKs\Windows\v7.1\Samples\winbase\service

フォルダーを覗いていただきますと・・・なんと、サンプルの実装ファイルは C# でも C++ でもなく、C 言語!
まさにシンプル!
シンプルではありますが、Windows サービスというプログラムの構成や仕組みが、ギュッとまとまっているのが、この simple サービス サンプルです。

 

構成や仕組みをご理解いただく前に、まずはビルドしてお使いいただくとしましょう。
本当に、アッ★ という間にご評価いただけますので、是非お試しくださいませ!

 

1.  最新の Windows SDK をインストールしてください。(2011 年 5 月 1 日現在、”Microsoft Windows SDK for Windows 7 and .NET Framework 4” が最新の Windows SDK です)

2.  先程のパスから、service フォルダーごと、お好きなフォルダー下 (下記例では、C:\TEST フォルダー) へコピーしてください。

例: C:\TEST\service

3.  スタート メニューから、[Microsoft Windows SDK v7.1] – [Windows SDK 7.1 Command Prompt] を選択し、“Windows SDK 7.1 Command Prompt” を管理者として実行します。

4.  “Windows SDK 7.1 Command Prompt” のカレント ディレクトリを、手順 2. のコピー先フォルダーへ移動します。

例: CD C:\TEST\service

5.  ここでひと手間! コピー先フォルダー下のメイクファイル (Makefile) を、以下のように編集します。

  このひと手間を飛ばしてしまうと、続く手順 6. で、以下のつれないビルドエラーが発生してしまいますので、どうぞご注意を・・・。

6.  nmake コマンドで、ビルド (コンパイルとリンク) します。

例: nmake

  残念なことに、このビルド中に、client.c ファイルのコンパイルで C4133 の警告 (warning) が出力されてしまいます。出力された警告内容をご覧いただくと・・・なんと、型キャストの指定ミス!

  警告が出力されても、ビルド自体はパスできますし、Windows サービスとしてのサンプル動作評価には影響しませんので、気にならない方はこのままにしておいても、問題なく次のステップへ進んでいただけます・・・。
  進んでいただけますが、勿論、以下のように Client.c のソースコードを修正して再度ビルドを実行し、すっきりとビルド パスしていただくのが一番ですよね。
  ここも、ひと手間! なポイントになりますでしょうか、大変失礼いたしました。

7.  ビルド環境に応じたフォルダー名で新規フォルダー (下記例では WIN7_X64_DEBUG フォルダー) が作成され、その下にビルドで生成されたファイルが配置されます。

 

ここまでのステップで、ランタイム依存のないシンプルな Windows サービスのビルドが完了しています。

生成されたファイルの内、拡張子が .exe のファイルが二つあるのを、ご確認いただけますでしょうか。
Windows サービス本体は、simple.exe ファイルの方で、client.exe ファイルは、Windows サービスと通信を行うクライアント アプリケーションのサンプルです。
申し遅れましたが、simple サービス サンプルは、Windows サービスだけではなく、Windows サービスと通信するクライアント アプリケーションのサンプルも含まれているんですね。
とってもお得です。

さて、ビルドが完了しましたら、次は Windows サービスのインストールと、動作テストをしてみましょう。最後は、アンインストールまで行います。

 

8.  “Windows SDK 7.1 Command Prompt” のカレント ディレクトリを、simple.exe が生成されたフォルダーへ移動します。

例: CD C:\TEST\service\WIN7_X64_DEBUG

9.  引数 –install を指定して、simple サービスをインストールします。simple サービス サンプルの simple.exe は、引数チェックで自分自身のインストール/アンインストールを実行できるように実装されていますので、とても便利です。

インストールの時: simple.exe –install
アンインストールの時: simple.exe –remove

10. インストールに成功したら、simple サービスを開始/停止してみましょう。コントロール パネルの [管理ツール] – [サービス] から、”Simple Service” サービスを選択して、手動で開始/停止することが可能です。

  または、手順 8. でインストールを行ったコマンド プロンプトから、それぞれ NET コマンドで開始/停止してもよいですね。

開始する時: NET START simpleservice
停止する時: NET STOP simpleservice

11. 停止する前に、simple サービスの稼働状況をチェックしてみましょう。
  Windows サービスは、ユーザー インターフェイスを持ちませんので、稼働状況の確認にはタスク マネージャが便利です。[全ユーザーのプロセスを表示する] チェックボックスを ON にしていただくことを忘れずに・・・simple サービスは、既定で SYSTEM アカウントで実行されるように実装されています。

12. 停止した後は、引数 –remove を指定して、simple サービスをアンインストールします。

 

いかがでしたでしょうか。
ステップ 5. と 6. で、ひと手間! ポイントが 2 か所(ということは、合計ふた手間ですね・・・)ありましたが、想像されていたよりは簡単に、Native の Windows サービスを扱っていただけたのではないでしょうか。
シンプルで、使い勝手の良い構造ではありますが、この simple サービスは Windows サービスの基本機能を全て実装した、非常に完成されたサンプル プログラムとなっています。
今後しばらく私 tomoshi の回では、この simple サービスをベースに、Windows サービスのあれやこれやを、ご案内できたら・・・と考えております。
どうぞよろしくお願いいたします。