トップ回答者
CallNtPowerInformation()でWindowsのCPUの状態を確認しようとするのですが、状態が取得できません

質問
-
マルチメディア系のアプリケーションを開発しているのですが、アプリケーションはCPUパワーが十分でなければスムーズに動作できません。
ノートPCなどは電源管理機能をそのまま使用されている人も多く、ときどきCPUパワーが省電力モードで動作していることがあります。
そのようなときに、アプリケーションを起動したときに、省電力モードかどうかを確認し、省電力モードであれば、警告を出したいを考えています。
CallNtPowerInformation()を使うと、ProcessorInformationや、ProcessorPowerPolicyの情報が取得できるようにドキュメントにありました。
現在、VistaとXPをアプリケーションの対象に想定していますので、このAPIが使えると考えていますが、関数が失敗します。
電源管理のこのAPIのサンプルコードなど掲載されている情報をご存じの方は教えていただけないでしょうか。
Reiji Tanaka
回答
-
いつもご助言いただき助かります。
WindowsXPのPCで動いたのでプログラムを疑っていませんでした。
ご指摘のとおりReturnコードを確認したところ、STATUS_BUFFER_TOO_SMALLでした。
ドキュメントをよく読むと、マルチコアの場合は、コアごとにデータが取得されるので、バッファが足りなかっただけでした。
お恥ずかしいかぎりです。
WindowsXPでもWindowsVistaでもどちらも期待した値を取得できましたので、問題は解決できます。
ありがとうございます。
Reiji Tanaka- 回答としてマーク Reiji 2009年6月17日 7:50
すべての返信
-
コードも掲載せずに質問してすみません。これじゃあフォローのしようがありませんよね。
単純に以下のコードで試してみました。
PROCESSOR_POWER_POLICY m_processor_power_policy={0};CallNtPowerInformation(
ProcessorPowerPolicyCurrent,
NULL,
0,
&m_processor_power_policy,
sizeof(PROCESSOR_POWER_POLICY));
とりあえず、VistaでVisualStudio2008で実行して、Debuggerで変数に値が変えるかを見ていますが、なにも情報がえられません。
今度は、WindowsXPで同じものを試すと、そちらでは成功しました。
このAPIのドキュメントをもう一度読み返すと、This information level is not supported.
Windows Server 2003 and Windows XP: The lpInBuffer parameter must be NULL; otherwise, the function returns ERROR_INVALID_PARAMETER.
The lpOutputBuffer buffer receives a PROCESSOR_POWER_POLICY structure containing the current system processor power policy in use.
とあり、原則はサポートされていないということが原因かもしれません。
Windows Vistaで同様のことができる関数が分かれば問題は解決できそうです。
よろしくお願いします。
Reiji Tanaka -
いつもご助言いただき助かります。
WindowsXPのPCで動いたのでプログラムを疑っていませんでした。
ご指摘のとおりReturnコードを確認したところ、STATUS_BUFFER_TOO_SMALLでした。
ドキュメントをよく読むと、マルチコアの場合は、コアごとにデータが取得されるので、バッファが足りなかっただけでした。
お恥ずかしいかぎりです。
WindowsXPでもWindowsVistaでもどちらも期待した値を取得できましたので、問題は解決できます。
ありがとうございます。
Reiji Tanaka- 回答としてマーク Reiji 2009年6月17日 7:50