UPSの状態確認 – プログラミング – Home

通知
すべてクリア

[解決済] UPSの状態確認


sys
 sys
(@sys)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

質問させて頂きます。

UPS電源を搭載したPC(XP Pro)上では、
コントロールパネルの電源項目で、
UPS機能の設定が行えます。

主な機能としては、
主電源が落ちた時に自動的にシャットダウンするのですが、

このUPS電源・機能が期待している設定を
行われているかどうか確認するAPI等、
ご存知でしたら教えて頂けませんか?


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

UPSを持ってないので検証できませんが、WMIでできるみたいです。
http://msdn.microsoft.com/en-us/library/aa394503.aspx
http://msdn.microsoft.com/en-us/library/aa394074.aspx


返信引用
sys
 sys
(@sys)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

早速のお返事有難うございます。

Win32_UninterruptiblePowerSupply Classの情報で
十分今回行いたい事が可能で驚きました。

ただ、WMIを1度も使った事がないので、
そこで不安が。。。

VC++2008(C++)の環境でも、
スムーズにWMIを実装する事が可能でしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

WMI では何らかのイベントが発生するまで待機というのもできます。
UPS で可能かどうかはわかりませんが、「UPSの状態が変化するまで待つ」というのもで
きるかもしれません。

WMI を使うのに楽な言語は? というと、まずは VBScript ですね。あとは C# や
VB.NET なども。
C++ でももちろんできますが、面倒臭さではトップだと思います。
サンプルはやはり VBScript 等が多いと思います。
まずはいきなり目的を達成しようとせず、簡単なサンプルで VBScript を C++ に翻訳で
きるようになっておくと、後々役立つと思います。

http://www.wmifun.net/
http://www.codeproject.com/KB/system/Using_WMI_in_Visual_C__.aspx
http://www.codeproject.com/KB/system/UsingWMI.aspx


返信引用
sys
 sys
(@sys)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

aetosさん
度々のお返事有難うございます。

早速ですがご紹介頂いたサイトを拝見させて頂きました。

どうやらCOM操作に似ているコードでしたので、
少し試してみてみます。

もし複雑でしたら、仰る通り
VBスクリプトからの翻訳の様な流れで
進めていこうと思います。
(何せあまり時間がないもので・・・)

今回非常に助かりました。
(一応解決済みという事で。)
また、分からない点がありましたら、
書き込ませて頂くので、
宜しくお願いします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

VBスクリプトから利用される WMI は Microsoft WMI Scripting というもので
VC++で使われる WMI とは微妙に違うインターフェースだったりします。

VBS版の方を忠実に翻訳するならこんな感じになるかと思います。
#UPS環境はないので検証はしてません。

#include <tchar.h>
#include <windows.h>
#include <atlbase.h>
#include <atlcom.h>
#include <wbemdisp.h>
#include <comdef.h>

int _tmain()
{
if(FAILED(CoInitialize(NULL))) {
return EXIT_FAILURE;
}
try {
CComPtr<ISWbemLocator> loc;
HRESULT hr = loc.CoCreateInstance(LWbemScripting.SWbemLocator);
_com_util::CheckError(hr);

CComBSTR nameSpace(LROOT\\CIMV2);
CComPtr<ISWbemServices> service;
hr = loc->ConnectServer(
NULL, nameSpace, NULL, NULL, NULL, NULL, 0, NULL, &service);
_com_util::CheckError(hr);

CComPtr<ISWbemObjectSet> objectSet;
CComBSTR query(LSELECT * FROM Win32_UninterruptiblePowerSupply);
CComBSTR lang(LWQL);
hr = service->ExecQuery(query, lang, 0x30, NULL, &objectSet);
_com_util::CheckError(hr);

CComPtr<IUnknown> unkEnum;
hr = objectSet->get__NewEnum(&unkEnum);
_com_util::CheckError(hr);

CComPtr<IEnumVARIANT> enumerator;
hr = unkEnum->QueryInterface(&enumerator);
_com_util::CheckError(hr);

CComVariant v;
hr = enumerator->Next(1, &v, NULL);
_com_util::CheckError(hr);
while(hr == S_OK) {
CComPtr<IDispatch> item(v.pdispVal);
v.vt = VT_EMPTY;

CComVariant value;
hr = item.GetPropertyByName(LAvailability, &value);
_com_util::CheckError(hr);

ATLTRACE2(_T(%d), value.uiVal);
ATLTRACE2(_T(\r\n));

hr = enumerator->Next(1, &v, NULL);
_com_util::CheckError(hr);
}
}
catch(_com_error& e) {
ATLTRACE2(e.ErrorMessage());
ATLTRACE2(_T(\r\n));
}
CoUninitialize();
return EXIT_SUCCESS;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました