Share via


PDH、Registry 関数でパフォーマンス情報を取得できない場合がある

こんにちは、Platform SDK (Windows SDK) サポートチームです。
今回はパフォーマンス情報がシステム起動時のタイミングで取得できない場合がある現象についてお知らせします。

現象
システム起動時にアプリケーション上で以下の何れかの方法でパフォーマンス情報の取得を試みると、期待される情報が取得できない場合があります。

- PDH (Performance Data Helper) 関数を使用する
- Registry 関数 (RegQueryValueEx 関数で HKEY_PERFORMANCE_DATA を指定) を使用する

原因
Windows OS はシステム起動タイミングでパフォーマンス情報に関する初期化処理を実施します。その際、パフォーマンス情報を管理するための情報がレジストリに一旦作成されますが、本タイミングでパフォーマンス情報の取得を行った場合に情報が取得できません。具体的には、初期化処理開始時に以下のエントリーが作成されてから初期化処理終了時に当該エントリーが削除されるまでの期間となります。

キー  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
名前  : Updating
種類  : REG_SZ
データ: WmiApRpl

確認方法
1)下記 MSDN ドキュメントのサンプル (Example の項) をビルドします。

Title: RegQueryValueEx function
URL: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx

2) ビルドしたサンプルを実行してコンソールに結果として表示されるバッファ サイズを確認します。
3) 上記 Updating エントリーを追加します。
4)再度サンプルを実行し、バッファ サイズを確認します。
5) 2) と比較してバッファ サイズが小さくなることを確認します。

対処方法
システム起動時にパフォーマンス情報に対する初期化処理が実行されることは OS の想定された動作になります。このため、システム起動時にパフォーマンス情報を取得する場合は上記 Updating エントリーの有無を確認し、PDH 関数、ならびに RegQueryValueEx 関数の呼び出しタイミングを適宜調整ください。