これにはカウンタパスと呼ばれる仕組みを理解しておく必要があります。その形式はファイルシステムのファイルパスと似ている部分がいくつかあります。次に、カウンタパスの形式を示します。\\Machine\PerfObject(ParentInstance/ObjectInstance#InstanceIndex)\Counterこれが最も長いカウンタパスの例となります。実際にはこれらの一部が不要な場合は省略可能となっています。カウンタパスを構成することができるようになっているのです。次にその例を示します。Bytes(使用可能メモリ量)を指定した形となっています。省略してよいことになっているため、その点を利用することにしています。これはオブジェクトがインスタンスを持たない場合は成立します。次に、インスタンスを必要とするカウンタパスの例を示します。オブジェクト名の後にインスタンス情報の括弧を指定することになります。上記の例で該当するのはObjectInstanceです。ParentInstanceは一部のオブジェクト、InstanceIndexは状況によって必要となります。InstanceIndexを指定する例を次に示します。同じ名前を持ったインスタンスが複数存在し得ることからきています。#1というように数字で区切れば、別のインスタンスを対象とすることができるようになります。インデックス順に対象となるインスタンスが異なるためです。最後に、ParentInstanceを利用する例を次に示します。インスタンスの指定では、まず親のインスタンスから指定することになっています。別のメモ帳プロセスの0番目のスレッドがモニタ対象となります。これをPDHに指定する手順について見ていきたいと思います。厳密にはPDHにはカウンタの値を初期化する関数は存在しません。結果としてカウンタが初期化されるという仕組みになっているのです。この機能により、開発者は複数のカウンタをまとめて初期化できることになります。*phQuery);szDataSourceは、データソースを表す文字列を指定します。dwUserDataは、クエリーに関連付けたいユーザーデータの値を指定します。phQueryは、作成されたクエリーのハンドルを受け取るアドレスを指定します。typedef定義されているHQUERYという型を利用することもできます。クエリーを作成したら、次はそれにカウンタを追加することになります。格納する構造体であると考えると分かりやすいでしょう。次に示すPdhAddCounterは、引数に指定されたカウンタパスを基にその構造体を作成します。phCounter);hQueryは、カウンタを追加するクエリーのハンドルを指定します。szFullCounterPathは、カウンタパスを表す文字列を指定します。関連付けたいユーザーデータの値を指定します。phCounterは、作成されたカウンタを受け取るハンドルを指定します。不要になったらPdhCloseQueryで閉じることになります。クエリーに関連したメモリが開放されることになります。);hQueryは、クエリーのハンドルを指定します。同時にカウンタのハンドルも使えなくなるという点に注意してください。追加されたカウンタに含まれる情報について考察します。0;}PdhOpenQueryの呼び出しは特に問題はないでしょう。インスタンス用の括弧が必要だということは忘れてはいけません。インスタンス名の誤りに関しては考慮していないということも重要です。関数は成功することになります。今回のようにカウンタの基本的な情報を取得するために利用することもできます。他にカウンタの説明テキストなどが含まれています。取得するのもこの関数となっています。次のコードは、PdhGetCounterInfoの呼び出し部分です。1回目の呼び出しで必要なメモリのサイズを第3引数で取得しています。その後、そのサイズを基にメモリを確保し、2回目の呼び出しでデータを取得します。第2引数をTRUEにしてPdhGetCounterInfoを呼び出します。開発者にとって煩わしいことです。カウンタパスを作成する関数が用意されているため、その使い方を確認してみることにします。カウンタパスの構成要素からカウンタパスを作成し、それを第2引数に格納します。第3引数はカウンタパスのサイズを格納する変数のアドレスを指定し、第4引数は0にします。インスタンスを必要としないオブジェクトではszInstanceNameもNULLにできるでしょう。PdhMakeCounterPathは便利な関数になると思われます。カウンタパスから構成要素を分解するPdhParseCounterPathがあります。