2009-07-13 18 views
2

私はwinref.hで公開されているAPIを通じてPerfmonカウンターの値を収集するアプリケーションを持っています - Perfmonカウンターの値を収集するためには、PerfmonカウンターのIDを渡すRegQueryValueExW興味があり、そのIDを取得するために、Perfmonカウンター名のリストをレジストリに問い合わせて、興味のあるものを探す必要がありますwinmon経由でperfmonカウンターIDを見つける

C++は私の選択の言語ではありませんが、その次は、おそらく構文エラーがたくさんで、不安定な例ですが、あなたのアイデアを得る:

DWORD IdProcessIndex = 0; 
WCHAR* RawStrings = new WCHAR[ len ]; 
WCHAR* pCurrent; 
DWORD nLenInChars; 

// Get the name id of the "ID Process" counter 
RegQueryValueExW(HKEY_PERFORMANCE_DATA, COUNTER009, 0, 0, (PBYTE)RawStrings, &len) 

pCurrent = (WCHAR*)RawStrings; 
while ((nLenInChars = wcslen(pCurrent)) != 0 && IdProcessIndex == 0) 
{ 
    WCHAR* pName; 
    pName = pCurrent + nLenInChars + 1; 

    if (wcscmp(pName, L"ID Process") == 0) 
    { 
     IdProcessIndex = _wtoi(pCurrent); 
    } 

    pCurrent = pName + wcslen(pName) + 1; 
} 

// Get data for the "ID Process" counter 
WCHAR strIdProcessIndex[32]; 
_itow(nIdProcessIndex, strIdProcessIndex, 10); 

RegQueryValueExW(HKEY_PERFORMANCE_DATA, strIdProcessIndex, NULL, NULL, (PBYTE)pData, &len) 

トラブルはそれはいくつかのMac上でWindows CE開発キットがインストールされているhinesの場合は、名前プロセスIDという名前の2番目のperfmonカウンタがあるため、誤ったカウンタのIDが検出されます。

私は彼らがいる順番以外の方法を見分けることができません - 現時点では、一致する名前で見つけた最初のカウンタを取ることが最善の策だと思っています。 ?

(.NETまたはそのような何かにこれを移行するために、そのことはできません)

答えて

2

私はこれが古いであることを認識が、場合には、それは役立ちます:

  1. ティム自身が困難であるバイナリデータを解析し、右です。痛みの世界のために準備してください。私はPDH(あなたのためにレジストリアクセスをカプセル化する)、またはそれが失敗した場合、WMI(WMIははるかに遅いことに注意してください)をお勧めします。
  2. パフォーマンスカウンタ(ID Process、インデックス784)のデータを取得することはできません。あなたはオブジェクト全体(Process、インデックス230)でそれを取得する必要があります。
  3. 組み込みオブジェクトのIDは、すべてのWindowsインストールでguaranteed to be the sameです。したがって、これが唯一のカウンターであれば、230を使用してください。 :)
+0

ありがとうございました - 私はIDが固定されていたことを認識していませんでした。これは事をもっと簡単にします! – Justin

+1

うれしかったです。これは、組み込みのカウンタにのみ当てはまりますが、SQL Serverカウンタなど、Windows後にインストールされたカウンタには当てはまりません。 –

0

私は2つの

を区別するためにどのような方法を参照してくださいカント、彼らは同じ値を与えていますか?もしそうなら、あなたはどちらを使うのですか?

これらが異なる場合は、両方お試しいただけますか? (例えば、両方のIDでOpenProcess)PDHのAPI(例えば、PdhOpenQuery)、またはCOMの使用に関する

(.NETまたはそのような何かにこれを移行するために、そのことはできません)

方法WMIによって公開されるインターフェイス両方ともネイティブのC++から行うことができます。

レジストリを直接読み取ってパフォーマンスカウンタを使用したことはありませんでしたが、何らかの理由で2つの「IDプロセス」カウンタが存在する可能性があります(WoW16/64のアプリケーションには別のプロセスIDがあります)。代わりに同じことが表示されます。 AdminstrativeTools \ Performance MMCパネルに2つ表示されていますか?

関連する問題