[delphi-users:4139] プロセッサの温度を表示する

154 views
Skip to first unread message

tonbo

unread,
Apr 26, 2015, 12:43:56 AM4/26/15
to delphi...@freeml.com
tonboです。お世話になります。

プロセッサの温度を測りたく、Webを参照し以下のコードを試しました。
(Formにボタン1つを配置)
while内が実行されません。
躓いており間違いをご指摘頂ければ幸いです。

--------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WbemScripting_TLB;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private }
public
function GetWMIstring2 (wmiHost, wmiClass, wmiProperty : string):string;
end;

var
Form1: TForm1;

implementation

uses ComObj, ActiveX;

{$R *.dfm}

function TForm1.GetWMIstring2 (wmiHost, wmiClass, wmiProperty : string):string;
var
Locator: ISWbemLocator;
Services: ISWbemServices;
SObject: ISWbemObject;
ObjSet: ISWbemObjectSet;
SProp: ISWbemProperty;
Enum: IEnumVariant;
Value: Cardinal;
TempObj: OleVariant;
SN: string;
begin
try
Locator := CoSWbemLocator.Create;
Services := Locator.ConnectServer(wmiHost, 'root\wmi', '', '', '','', 0, nil);
ObjSet := Services.ExecQuery('SELECT * FROM '+ wmiClass, 'WQL', wbemFlagReturnImmediately or wbemFlagForwardOnly , nil);
Enum := (ObjSet._NewEnum) as IEnumVariant;
while (Enum.Next(1, TempObj, Value) = S_OK) do //ここから
begin
SObject := IUnknown(tempObj) as ISWBemObject;
SProp := SObject.Properties_.Item(wmiProperty, 0);
if VarIsNull(SProp.Get_Value) then
result := ''
else
begin
SN := SProp.Get_Value;
result := SN;
end;
end;
except
on exception do
result := '';
end;
end; //ここへ飛ぶ

procedure TForm1.Button1Click(Sender: TObject);
var tmpstr : string; cputemp : Integer;
begin
tmpstr := getWMIstring2('','MSAcpi_ThermalZoneTemperature','CurrentTemperature');
if tmpstr <> '' then
Begin
cputemp:= (StrToInt(tmpstr) - 2732) div 10;
form1.caption := IntToStr(cputemp) + ' °C'
end else
form1.Caption := 'ERROR';
end;
end.
--------------------------------------

【補足】
・オリジナルのコード
 http://www.delphipraxis.net/97383-notebook-temperature-2.html

・環境:Windows 7 32bit/64bit、Delphi 7/XE7/XE8 同じ結果です。

・WbemScripting_TLB の作成は、
 KENCHさんの「Delphi de WMI」
 http://homepage3.nifty.com/KENCH/open/wmi/delphi_wmi.htm
 Mr.XRAYさんの「898_WMI イントロダクション」
 http://mrxray.on.coocan.jp/Delphi/plSamples/898_WMI_Introduction.htm
 を参考にしました。ありがとうございます。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆*:・★☆。.:*:・★*:.。:* ・☆。.:*:・★.‥∴★¨∴
突然の来客、急な出張、勝負の合コン、結婚式、飲み会、
デート、同窓会・・・
まいった!まさに今!急な出費に備えての1枚!
http://ad.freeml.com/cgi-bin/sa.cgi?id=mH76N
☆*:・★☆。.:*:・★*:.。:* ・☆。.:*:・★.‥∴★¨∴
------------------------------------------------------[freeml byGMO]--

kame

unread,
Apr 26, 2015, 9:55:30 AM4/26/15
to delphi...@freeml.com
例外が発生しているのではないですか。
まずは例外発生時にエラー表示させてみてはどうですか。
MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
え!27日で英語がペラペラになるって本当?
10,000人以上が体験した、「たった一つの事」を覚えるだけの勉強法とは?
↓↓
http://ad.freeml.com/cgi-bin/sa.cgi?id=mHDvV
------------------------------------------------------[freeml byGMO]--

tonbo

unread,
Apr 26, 2015, 5:15:27 PM4/26/15
to delphi...@freeml.com
kameさん
tonboです。ご返事、ありがとうございます。

例外は発生していません。
whileの条件に合わず実行されないようです。

実は、WMIで'MSAcpi_ThermalZoneTemperature'
'CurrentTemperature'を使ってプロセッサの温度を表示する解説が
見当たらず、とにかくWeb上の例を色々試しました。
動くものはありませんでした。このソースもその一つです。

他の例では、
「wbemFlagReturnImmediately or wbemFlagForwardOnly」
($10 or $20)のところを
「wbemFlagReturnImmediately and wbemFlagForwardOnly」に
しているものがありましたが、こうするとDelphi 7では
「デバッガ例外が発生
プロジェクト project1.exeがEOleExceptionクラスの例外を生成しました。
'サポートされていません'・・・」
となります。Delphi XE7/XE8でも同様です。

MR.XRAYさんの
898_WMI イントロダクション
http://mrxray.on.coocan.jp/Delphi/plSamples/898_WMI_Introduction.htm
900_WMI ハードウェア関係情報の取得 05_プロセッサ の情報を取得
http://mrxray.on.coocan.jp/Delphi/plSamples/900_WMI_HardWare.htm#05
は動作しています。
しかし、'MSAcpi_ThermalZoneTemperature','CurrentTemperature'に
置き換えるとデータが取れません。

PC、OS、Delphiを変えても同様だったため、お手上げ状態で
ご質問しました。

WMIでプロセッサの温度を取得できている方、実例を
お知らせ頂けると助かります。


-----Original Message-----
From: post-01071731-mbbbg01=yahoo...@post.freeml.com [mailto:post-01071731-mbbbg01=yahoo...@post.freeml.com] On Behalf Of kame
Sent: Sunday, April 26, 2015 10:55 PM
To: delphi...@freeml.com
Subject: [delphi-users:4140] Re: プロセッサの温度を表示する

例外が発生しているのではないですか。
まずは例外発生時にエラー表示させてみてはどうですか。


-----Original Message-----
From: post-01041697-kame=osa.at...@post.freeml.com
[mailto:post-01041697-kame=osa.at...@post.freeml.com] On Behalf Of tonbo
Sent: Sunday, April 26, 2015 1:44 PM
To: delphi...@freeml.com
Subject: [delphi-users:4139] プロセッサの温度を表示する

ポイントタウン byGMO ★登録は1分★
東証一部上場企業グループ運営だから安心・安全!
今なら無料登録で楽天スーパーポイント3,000円分が当たるチャンス!
>> 今すぐ無料登録しよう! <<
http://ad.freeml.com/cgi-bin/sa.cgi?id=mHEYc
------------------------------------------------------[freeml byGMO]--

Fukushi

unread,
Apr 27, 2015, 12:12:44 AM4/27/15
to delphi...@freeml.com
tonboさん、こんにちは。福士と申します。

> しかし、'MSAcpi_ThermalZoneTemperature','CurrentTemperature'に
> 置き換えるとデータが取れません。
>
> PC、OS、Delphiを変えても同様だったため、お手上げ状態で
> ご質問しました。
>
> WMIでプロセッサの温度を取得できている方、実例を
> お知らせ頂けると助かります。

そもそもWMIで所望のデータを取得できるかどうか、とりあえず

WMI Delphi Code Creator
https://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/

のようなツールで試してみてはいかがでしょうか。

# 手元の環境ではデータを取得できるものとできないものがあるような
# 感じです(OSはいずれもWindows 7 Pro/x64)。

WMI Delphi Code Creatorを起動して、Tasksを"WMI Class Code
Generation"、Namespacesを"root\WMI"として、Classesから
"MSAcpi_termalZoneTemperature"を選択して"Select all Properties"を
チェックオンして"Get WMI Class Instance"ボタンをクリックすると
その環境でのデータが表示されます。

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
デザインから、場所から、日時から予約できる
ネイル予約サービス「NAIL+(ネイルプラス)」
http://ad.freeml.com/cgi-bin/sa.cgi?id=mHK1b
お得なクーポンでいますぐ予約♪
詳しくは△▲URL▲△を今すぐチェック!
------------------------------------------------------[freeml byGMO]--

tonbo

unread,
Apr 27, 2015, 8:09:22 AM4/27/15
to delphi...@freeml.com
福士さん
お世話になります。tonboです。

驚きました。こういうツールがあったのですね。
使い方まで説明下さり、ありがとうございました。

Windows 7 Pro 32bitで動作させてみました。

1.「MSAcpi_termalZoneTemperature」で「Get WMI Class Instance」
ボタンを押すとで真っ白の画面が出ました。
データを取得不可、ということですね。

2.root\CIMV2にある「Win32_TemperetureProbe」を確かめました。
「Get WMI Class Instance」ボタンを押すと
「Description」に「CPU0 Temperature」があります!
しかし「CurrentReadind」は空白でした・・・
温度データは取れない、ということと思います。

3.「Saveボタン」を押すと、表示されているコンソールアプリが
保存されました。
Delphi XE8でコンパイルするとEVariantTypeCastErrorが出たので、
Writeln(Format('Availability %d',[Integer(FWbemObject.Availability)]));等を
Writeln('Availability ' + VarToStr(FWbemObject.Availability));等に変えました。
無事動作し、2.と同じ結果となりました!

1.2.とも目的のデータは取れませんでしたが、
「WMI Delphi Code Creator」を知ったのは大収穫です。
WMIでは、無駄な時間を費やすことは無くなりそうです。

本当にありがとうございました。m@m

(改めてWebで「WMI Delphi Code Creator」を検索すると、
MR.XRAYさんが紹介されていましたね)


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
え!27日で英語がペラペラになるって本当?
10,000人以上が体験した、「たった一つの事」を覚えるだけの勉強法とは?
↓↓
http://ad.freeml.com/cgi-bin/sa.cgi?id=mHSmX
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages