tclock-080427-analog
追記 08/06/03
TClock2ch付属サイト…に更新版をあげておきました。Vista SP1でスリープからの復旧時にexplorer.exeが固まる問題を修正しています。
以下本来の記事
2つ以上CPUコアのある場合、Vista環境で書式 <%CC%> が正常に動作しない問題を修正しました(tclock-080427-analog.cab)。
.履歴 080427 exe :時刻合わせの設定画面でログを読み込むように変更 dll :Vista環境でCCがでたらめな値を表示する問題を修正 :CPUコアごとのクロック数取得書式 CC[0-7] を追加
この問題は本家が <%CC%> を実装した段階で潜在的にもっていたものですが、XPからVistaになる際に CallNtPowerInformation に仕様変更があったことで表面化しました。
この関数は、XPでは複数のコアがある場合でも、 PROCESSOR_POWER_INFORMATION 構造体1つ分のバッファを渡せば CPU #0 の情報を取得することができました。しかしVistaでは、コア数と同じ数の PROCESSOR_POWER_INFORMATION 構造体をバッファとして要求し、バッファサイズが足りない場合は STATUS_BUFFER_TOO_SMALL を返して情報は取得できません。よって正しくは次のコードのように使用する必要があります。
SYSTEM_INFO si; GetSystemInfo(&si); SIZE_T sz = si.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION); PROCESSOR_POWER_INFORMATION* info = new PROCESSOR_POWER_INFORMATION [si.dwNumberOfProcessors]; if (CallNtPowerInformation(ProcessorInformation, 0, 0, info, sz) == STATUS_SUCCESS) { for (DWORD i=0; i<si.dwNumberOfProcessors; ++i) std::cout << info[i].CurrentMhz << std::endl; } delete [] info;
従来TClockでは構造体1つ分のみのバッファを渡していたため <%CC%> は CPU #0 の情報のみを取得していました(あるいは取得に失敗しながらも、エラーチェックをしていないがためにでたらめな値を表示していました)。
今回の <%CC[0-7]%> の追加により CPU #0-7 の情報を取得できるようになり*2、従来の <%CC%> も <%CC0%> とみなすことによって変更なく使用することができるようになりました。