#menu(MenuPG)
**[[Wmi Program>Program/Wmi]] [#h9705ced]
***必要なシステム類 [#yb7ababc]

-''Visual Studio 6 以降の Visual C++''&br;
(自分は現在Visual Studio.Net 2003を使用)&br;
&br;
-''最新版のPlatform SDK と WMI SDK''&br;
入手は[[InternetExplorer:http://www.microsoft.com/japan/ie/]]で[[このサイト:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/]]にアクセスしてインストールして下さい。&br;
Netscapeや[[FireFox>http://www.mozilla-japan.org/]]などIE以外のブラウザを使用した場合、エラーになります。&br;
このサイトにはPlatform SDK、WMI SDK以外のSDKも置かれています。&br;
容量はとられますが、入れて置いて損は無いかもしれません。&br;
&br;
-''最新のDirectX SDK''&br;
ゲームプログラミングをやるなら入れておいたほうがいいです。&br;
無くても創る事は可能ですが、今後WindowsそのものがDirectXベースに移行するので、研究しておきましょう。&br;
入手は[[このサイト:http://www.microsoft.com/japan/msdn/directx/downloads.asp]]から。&br;
現在の最新版は「Microsoft DirectX 9.0 SDK Update (December 2004)」(DirectX9.0c SDK)です&br;
日本語ドキュメントは別途インストールする必要が在るので注意し下さい!

***Header [#t6554bd1]
-''Wmiのheaderで宣言しているWmi用のインクルード宣言と変数です''
 #include <wbemidl.h>   // WBEM(WMI)インターフェース
 #include <WbemProv.h>   // WBEM(WMI)インターフェース
 #include <WbemCli.h>   // WBEM(WMI)インターフェース

-''変数はheader内でプロテクト変数として宣言しています''
-''変数はheader内でローカル変数として宣言しています''
 IWbemLocator*   m_pIWbemLocator;
 IWbemServices*   m_pIWbemServices;
 IEnumWbemClassObject* m_pIEnumWbem;
 IWbemClassObject* m_pIWbemObject;

***初期化 [#x33a445b]
-''必要な初期化部分としては、COMの初期化が必要です''&br;
また、WMIを使用するためのヘッダーも必要ですので、ちょっと過剰かもしれませんが、
私は下記のHeaderとlibraryをインクルードしています。&br;
あらかじめ[[VisualStudio:http://www.microsoft.com/japan/msdn/vstudio/]]の設定で、PlatformSDKとWMI SDKへのパスは設定して在ります。
#htmlinsert(wmiheader.htm)
&br;
-上で少し触れていますが、WMIはCOMベースのシステムなので、あらかじめCOM+をmulti-threadで初期化しあります。&br;
COMはWMI以外にもDirectXなどでも使用するので、プログラムのMAIN関数の最初に初期化を入れ込んでおくと便利です。&br;
COMは1度初期化すれば、そのまま使用できるので、何度も初期化しないで下さい。&br;
COMの開放も、プログラムの最後に行えば問題ありません。&br;
 
-さて、WMIの初期化ですが、ComSecurityの設定を行う必要があります。&br;
次にWMIロケーターを作成します。&br;
ローケーターの作成時に適切なClassIDを入れないと使用出来ません。&br;
下記のようなコードになります。&br;
#htmlinsert(wmiinit.htm)

***終了処理 [#t023f8d3]
-終了部分もあわせて、記載しておきます。&br;
きちんと終了しないと、メモリーリークの元なので注意!&br;
#htmlinsert(wmiend.htm)

***[[Wmi Command]] [#fc743720]
-初期化が終了すれば、WMIでWindowsの情報を取得出来ます。&br;
情報の取得はWMI ServiceからEnumする事で取り出せます。&br;
Enumには「Win32_*」を使用して各種情報を取得します。&br;
Win32_*には「Win32_BIOS」や「Win32_VideoController」等が在ります。&br;
Sampleとして、「Win32_VideoController」でのコードを掲載しておきます。&br;
他のWin32_*や、取得できる情報の詳細に関してはWMI SDKのドキュメントを読んで下さい。&br;
#htmlinsert(wmicommand.htm)
-↑のような形で、ビデオカードの情報を取得出来ます。&br;
取得できる情報はもう少し在りますが、この辺りの情報が取得できれば十分だと思います。

***[[Wmiコマンド解説]] [#xb5f61ab]
-m_CompStatus」は取得した情報を格納するための自作構造体です。&br;
-「m_pIWbemServices->CreateInstanceEnum」&br;WMI ServiceをWin32_VideoControllerで
EnumしてWin32_*を取得開始する。&br;
-「m_pIEnumWbem->Next」&br;WMI objectを取得して、そのobjectを元に情報を取得します。&br;
-「VariantClear(&var);」は「->Get」で取得した情報を確保したら、必ず行って下さい。&br;
これを行わないと次の情報が取得できなかったり、メモリリークの元です。&br;
このプログラムでは「GetStringValue」など関数にして情報取得を一元化しています。

-他の情報を続けて取得する場合ですが、WMI ObjectとWMI Enumだけを開放すれば、&br;
可能なので、WMI ServiceとWMI Locatorは開放する必要は在りません。&br;
WMI情報の取得は時間が結構かかるので、出来るだけ簡略化できるところは簡略に済ませましょう。