◆パフォーマンスモニタ returns 〜 カスタムパフォーマンスモニタの作成 その6

[ ホーム ] [ 上へ ] [ パフォーマンスモニタ returns 〜? カスタムパフォーマンスモニタの作成 その7 ]

パフォーマンスDLLを実装するにはいろいろ前提が多くて前置きがかなり長くなりました。 パフォーマンスデータ収集対象のアプリケーションを作りカスタムパフォーマンスDLLの作業手順 の3、4が前頁までにできたことになります。ここから本題の手順である1、2の カスタムパフォーマンスカウンタを構築していきます。

(PerfDnpカウンタ情報をレジストリに登録)

パフォーマンス収集アプリケーションからDnpに関連するパフォーマンスデータの 要求がRegQueryValueExによって行われたら、パフォーマンスシステムは、所定の位置の レジストリ情報を元にDLLをロードして規定の関数を呼び出すことによってデータを収集します (概要を参照のこと)。その位置とは
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xxxxx\Performance
であり、今回の場合はレジストリエディタでみると、 このような キーとエントリを登録する必要があります。(xxxxはPerfDnpが入ります)

それともうひとつ レジストリデータでのパフォーマンスデータの取得を 見直すとわかりますが、パフォーマンスデータの収集にはパフォーマンスオブジェクト/カウンタに インデックスを割り振らないといけません。この一覧が
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\011
ここに登録されているので、パフォーマンスシステムが管理している最後のインデックス値と プログラマが作成したオフセット値(相対位置)によって、 lodctrユーティリティ を使って登録していきます。

まずはDLL名、Open, Collect, Closeの各関数名を登録する レジストリ追加情報ファイル(.regファイル)の作成から。
ソリューションエクスプローラのPerfDnpプロジェクトフォルダを右クリックして 追加(D)→新しい項目(W)で新しい項目の追加ダイアログが起動しますので以下の設定をしてください。

カテゴリ(C)    :ユーティリティ
テンプレート(T):テキストファイル
ファイル名(N)  :PerfDnp.reg
→追加(A)

作成されたPerfDnp.regファイルに以下のように記述したのち保存してください。

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfDnp\Performance]
"Library" = "PerfDnp.dll"
"Open" = "OpenDnpPerformanceData"
"Collect" = "CollectDnpPerformanceData"
"Close" = "CloseDnpPerformanceData"

続いてパフォーマンスオブジェクト/カウンタのインデックス関係の設定ファイルを作成します。

オフセット値を設定するヘッダファイル(.hファイル)の作成。
ソリューションエクスプローラのPerfDnpプロジェクトフォルダを右クリックして 追加(D)→新しい項目(W)で新しい項目の追加ダイアログが起動しますので以下の設定をしてください。

カテゴリ(C)    :コード
テンプレート(T):ヘッダファイル(.h)
ファイル名(N)  :DnpCtrOffset.h
→追加(A)

作成されたDnpCtrOffset.hヘッダーファイルに 次のように記述したのち保存してください。

/*    DnpCtrOffset.h
オブジェクト/カウンタインデックスのオフセット値(0から始まる偶数に設定すること)
レジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfDnp\Performanceの
                                                               ^^^^^^^
"First Counter" "First Help"の値に加算されてPERF_OBJECT_TYPE, 
PERF_COUNTER_DEFINITIONに収められる
(PerfDnp.iniの[info]内のsymbolfileとDataDnp.cppで使われる)
*/
#pragma once

#define     DNP_OBJ         0     //DnpカウンタオブジェクトIndexのOffset
#define     DNP_ELAPSED     2     //Dnp経過時間カウンタIndexのOffset
#define     DNP_COLOR       4     //Dnp色表示カウンタIndexのOffset

次にlodctrユーティリティ が使用するiniファイルの作成。
ソリューションエクスプローラのPerfDnpプロジェクトフォルダを右クリックして 追加(D)→新しい項目(W)で新しい項目の追加ダイアログが起動しますので以下の設定をしてください。

カテゴリ(C)    :ユーティリティ
テンプレート(T):テキストファイル
ファイル名(N)  :PerfDnp.ini
→追加(A)

作成されたPerfDnp.iniファイルに次のように記述したのち保存してください。

[info]
drivername=PerfDnp
symbolfile=DnpCtrOffset.h

[languages]
009=English
011=Japanese

[objects]
DNP_OBJ_009_NAME=Dnp Application
DNP_OBJ_011_NAME=Dnp Application

[text]
DNP_OBJ_009_NAME=Dnp Application
DNP_OBJ_009_HELP=Dnp Application Counter Object
DNP_OBJ_011_NAME=Dnp Application
DNP_OBJ_011_HELP=Dnpアプリケーションパフォーマンスオブジェクト
DNP_ELAPSED_009_NAME=Dnp Elapsed Time 
DNP_ELAPSED_009_HELP=Elapsed Time after Dnp Dialog is Opened
DNP_ELAPSED_011_NAME=Dnp Elapsed Time
DNP_ELAPSED_011_HELP=Dnpダイアログが表示されてからの経過時間
DNP_COLOR_009_NAME=Dnp Ctrl Color 
DNP_COLOR_009_HELP=Background Color Displayed in Control that belong to Dialog
DNP_COLOR_011_NAME=Dnp Ctrl Color
DNP_COLOR_011_HELP=ダイアログに属するコントロールに表示される背景色

以上でレジストリに登録する設定ファイルの準備ができました。あとは、 regeditと lodctrユーティリティで登録するだけです。lodctr.exeは システムディレクトリにあるはずなので一応確認してみてください。

いったんVisual Studioを離れて、 スタート→ファイル名を指定して実行(R)で
cmd [リターン]
でコマンドプロンプトを表示して、上記3つのファイルを保存したディレクトリに移動してください (xxxxx\Projects\PerfCustom\PerfDnp)。最後に以下のコマンドを順に実行してください。

regedit.exe  PerfDnp.reg      [リターン]

「PerfDnp.reg内の情報をレジストリに追加しますか?」とダイアログが 表示されるので「はい」をクリック。
「PerfDnp.reg内の情報が、レジストリに正しく入力されました」と表示されます。

ここで、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfDnp\Performance のキーができて、"Library","Open","Collect","Close"の 各エントリに正しく値が入っているかレジストリエディタで確認してください。

確認ができたら、再びコマンドプロンプトに戻り、以下のコマンドを実行してください。

lodctr.exe  PerfDnp.ini    [リターン]

これでこちらと同じ キーとエントリができていると思います。

※注意※ レジストリ登録が必要なくなったら、コマンドプロンプトから
 unlodctr  PerfDnp  [リターン]
を実行してインデックスを更新した後、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfDnp\Performance キーを削除してください。

以上でレジストリの登録が終わったので、いよいよ、PerfDnp.cppで Open, Collect, Closeの各関数の実装を行います。