seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

Win32サービスを再勉強

以前はアプリケーションを形作ってから「サービスにして欲しい」という要望をうけて、とりあえず、あちこちのサンプルをみて真似しただけのサービスだった。
改めてMSDNライブラリを見ながらサービスを作ってみる。

以前気が付かなかったこと。

(1) CreateServiceのオプション
サービスをレジストリに登録するには「CreateService API」を用いるが、このときサービスの実行ファイル(EXE)を指定する。日本語ドキュメントにはかかれていないが、英語版をみると「実行ファイルへのパス」のほかに「引数オプション」も登録できる。
以前はオプションを登録できるとは知らなかったので、サービスとして起動されたのか、そうでないのか判断するにはタイムアウト(30秒)で失敗するかどうかで判断するしかないのか、と怪訝に思っていたのだが、オプションが指定できるのならば引数チェックで判断できるじゃないの。

(2) ServiceMainのオプション
サービスプロセスは、サービスことにスレッドを立ち上げてServiceMainを呼び出す。
サービスプロセスは複数のサービスをもつことができるが、これを1つのServiceMain関数から分岐する方法はないのか、と怪訝に思っていた。
ServiceMainの最初の引数には、かならずサービス名が入ってくるので、これも引数チェックで判断できるじゃないの。
こちらは、ちゃんと日本語訳にも書かれている。(うーん、5年前にもあったけなぁ…。)