◆VC++ 2005でのWindows Service制御 - Win32API編

[ 上へ ] [ Service - VB2005 - 前準備 ] [ Service - VBA(VB6) - Win32 API編 ] [ Service - VBA(VB6) - WMI編 ] [ Service - VC++ 2005 - Win32API編 ]

始める前に、ここを読んでください

・プロジェクト&クラス作成

VC++の場合はMFCにサービスを扱うクラスがあればいいのですが、あいにく無さそう なので、VBA (VB6)でのWindows Service制御 - Win32 API編 で使ったAPIで処理します。特段に前置きもないので早速プロジェクトを作成します。

できるだけ処理が分かりやすくなるようにWin32コンソールアプリケーションを選んで プロジェクト名は任意でつけてください。以後説明のためにTestWinServiceという 名前にします。TestWinService.cppにmain関数のスケルトンができていると思いますが、 そのままにして次にいきます。

サービス状態・スタートアップの種類の取得/変更を扱うクラスをつくっておくと、 後でも使い回しができそうなのでカプセル化しておきます。
ツールバーのプロジェクト(P)→クラスの作成(C)で「クラスの追加」ダイアログボックスが表示 されますので左側のカテゴリ(C)ペインで「C++」を右側のテンプレート(T)で「C++」を選択し、 追加(A)ボタンを押してください。
汎用C++クラスウィザードダイアログボックスが現れますのでクラス名をCWinServiceとし、 あとは何もしないで完了ボタンを押してください。(ヘッダファイル名とソースファイル名が WinService.h、WinSerivce.cppとして自動で入力されています)

・ヘッダファイル・ライブラリファイル

実装の前に、このクラスで VBA (VB6)でのWindows Service制御 - Win32 API編で使用した APIを使いますが、例えばMSDNでOpenSCManagerのドキュメントをみてください。一番下に 対応情報として、ヘッダ : winsvc.h内で宣言、インポートライブラリ : advapi32.libとあり ますので、実装ファイルWinService.cppにwinsvc.hをインクルードしなければなりません。 さらに、Windowsアプリですから、windows.hも同様にインクルードします。

<コード1>

#include "StdAfx.h"

#include <winsvc.h>        //←このあたり
#include <windows.h>       //←このあたり

#include "WinService.h"

今後、機能を拡張するとさらにインクルードファイルを追加していきます。 ということは別のプロジェクトで、もしこのクラスを利用としたいとは、その実装ファイルで 最低winsvc.h、windows.h、WinService.hの3ファイルをインクルードしなければなりません。 面倒です。どのファイルをインクルードしないといけないか覚えてられません。そこで1つの ヘッダファイルを作ってこれら必要ファイルを入れ込んじゃいます。そうすれば、これから作った ヘッダファイル1つをインクルードすればよいことになります。

ツールバーのプロジェクト(P)→新しい項目の追加(W)でダイアログボックスが表されます。 左ペインのカテゴリ(C)で「コード」、右ペインのテンプレート(T)でヘッダファイルを選択し、ファイル 名をStdWinService.hとして追加ボタンを押してください。追加されたStdWinService.hファイル に以下を記述してください。

[StdWinService.h]

#ifndef _STDWINSERVICE_
#define _STDWINSERVICE_

#ifndef _WINDOWS_
#include "windows.h"
#endif

#ifndef _WINSVC_
#include "winsvc.h"
#endif

#include "WinService.h"

#endif //_STDWINSERVICE_

今後、機能を拡張したとき必要になったインクルードファイルは ここに記述していけばいいです。そして、最後に コード1で実装ファイルWinService.cppに 追加したインクルードファイル群をまとめたStdWinService.hに変更します。

#include "StdAfx.h"
//#include <windows.h>         //コメントアウト
//#include <winsvc.h>          //コメントアウト
//#include "WinService.h"      //コメントアウト
#include "StdWinService.h"     //WinService用インクルードファイル
次にインポートライブラリadvapi32.libを設定しなければなりませんが、実は既に設定されています。 ツールバーのプロジェクト(P)→WinServiceのプロパティ(P)でプロパティページを表示させて ください。左側のツリービューで
 - 構成プロパティ
      - リンカ
         - コマンドライン
を選択してリンカに渡すオプションを表示させてください。
上記の赤丸に設定されています。他にどんなライブラリが設定されているかも確認すると いいかもしれません。追加するライブラリファイルがある場合は
- 構成プロパティ
    - リンカ   
    - 入力
を選択して右側のペインの追加の依存ファイルという項目から追加してください。

次は実装ですが、現状のWinService.h、WinService.cppのスケルトンを表示しておきます。

//WinService.h////////////
#pragma once

class CWinService
{
public:
    CWinService(void);
    ~CWinService(void);
};

//------------------------------------------------------------------------
//WinService.cpp////////

#include "StdAfx.h"
//#include <windows.h>         //コメントアウト
//#include <winsvc.h>          //コメントアウト
//#include "WinService.h"      //コメントアウト
#include "StdWinService.h"

CWinService::CWinService(void)
{
}

CWinService::~CWinService(void)
{
}