- 締切済み
C++ WMI レコード件数取得方法
お世話になっております。 C++でWMIを使用して、別PCのディスク容量を取得しようと思っています。 SQLの検索結果の「レコード件数」を取得する方法はありますでしょうか? (レコード件数で配列サイズを決めようとしています) ADOとかだとRecordCountとかで取得出来るのですが・・・。 COMオブジェクトで、IUnknownインターフェイスを使っているらしいので、 それの参照カウントって物の件数を調べられたら可能かとも考えましたが、 わかりませんでした・・・。 すみませんがご教授ください>< 以下が記述途中のソース抜粋です。 ===== HRESULT hres; ULONG uReturn = 0; IWbemServices *wbem_services = NULL; IEnumWbemClassObject *wbem_enumerator = NULL; IWbemClassObject *pclsObj = NULL; unsigned long *DiskSize; //本当はクラス使用です。 hres = wbem_services->ExecQuery(L"WQL", L"SELECT * FROM Win32_LogicalDisk WHERE DriveType=3", WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &wbem_enumerator); ↓↓↓↓↓ //ここで、RecordCountのように件数を取得がしたい。 DiskSize = new int[wbem_enumerator->RecordCount]; ↑↑↑↑↑ while (hres == S_OK) { hres = wbem_enumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); } delete [] DiskSize;
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
一度、Next() でカウントしながら最後までループして、Reset() してはどうでしょうか。 ( WBEM_FLAG_FORWARD_ONLY を外します。) IEnumWbemClassObject *wbem_enumerator = NULL; hres = wbem_services->ExecQuery( L"WQL", L"SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3", WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &wbem_enumerator ); IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; int count = 0; while( hres == S_OK ) { hres = wbem_enumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if( hres == S_OK ) { count++; } } _int64 *DiskSize = new _int64[ count ]; VARIANT v; hres = wbem_enumerator->Reset(); int i = 0; while( hres == S_OK ) { hres = wbem_enumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if( hres == S_OK ) { hres = pclsObj->Get( L"Size", 0, &v, NULL, NULL ); DiskSize[ i ] = _wtoi64( v.bstrVal ); VariantClear( &v ); pclsObj->Release(); i++; } }
お礼
回答ありがとうございます。 1度その方法も考えたのですが、 2度もループさせるのがあまり好きではないので最後の手に置いてました。 この方法だと、WBEM_FLAG_FORWARD_ONLYを外さないといけないんですね。 後で、調査する可能性もあったのでありがたいです^^; 後、WBEM_FLAG_FORWARD_ONLYで検索した所、 「[WMI基礎] Remote で動作する仕組み + ExecQuery と ExecQueryAsync の違い ~ “wbemFlagForwardOnly” は Count プロパティが取れない ~」 って記述が見つかりました。 もしかしたら、Countが使えるのかもしれません。 一旦、この路線で調査してみます。 http://blogs.technet.com/b/jpilmblg/archive/2010/03/29/wmi-remote-execquery-execqueryasync-wbemflagforwardonly-count.aspx
補足
結局、vector配列を使う事にしました。 2回ループさせるのが嫌いな理由として、 同じループ処理を2回も走らせると処理速度が落ちそう、後なんか1回で済ませられず無駄っぽいって考えがあります。 で、WBEM_FLAG_FORWARD_ONLYをつけると 「キャッシュされないということは、その分のオーバーヘッドが減るので処理は高速化される」らしいです。 vector配列使った場合の処理速度 < WBEM_FLAG_FORWARD_ONLY付けない場合の(リモート)処理速度 になりそうな予感がしますので・・・。 最後に本音。 WBEM_FLAG_FORWARD_ONLY付けない場合の、countプロパティの取得方法わからなかった・・・。 以上、ありがとうございます。