ASSOCIATORS OFステートメントのWHERE句の後に定義済みキーワードと値を指定できる。
ResultClassは、数ある関連インスタンスの中で、どのクラスのインスタンスだけを返すか絞り込める。
ASSOCIATORS OF ステートメント - Win32 apps | Microsoft Docs
SELECTなしに、いきなりASSOCIATORS OFいけるのか試してみる。
Win32_USBControllerのホストコントローラに関連するインスタンスを出してみる。
// クエリの実行. std::wstring q = L"ASSOCIATORS OF{Win32_USBController.Name=\'"; // "ASSOCIATORS OF{Win32_USBController.Name=\'"をqにセット. q = q + L"Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)"; // "Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)"を連結. q = q + L"\'}"; // "\'}"を連結. BSTR strQueryLanguage = SysAllocString(L"WQL"); // SysAllocStringでstrQueryLanguageを"WQL"で初期化. BSTR strQuery = SysAllocString(q.c_str()); // SysAllocStringでstrQueryをq.c_str()で初期化. hr6 = pServices->ExecQuery(strQueryLanguage, strQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); // IWbemServices::ExecQueryでクエリ実行. if (FAILED(hr6)){ // FAILEDマクロで判定.
Nameを固定で指定する。
あれ?出ない・・・。
""指定したNameに当てはまるインスタンス"に関連したインスタンス"という単純な話ではないのか・・・。
DeviceIDならいけるのかなとおもったけど、固定だと見せにくいなあ・・・。
// クエリの実行. std::wstring q = L"ASSOCIATORS OF{Win32_USBController.DeviceID=\'"; // "ASSOCIATORS OF{Win32_USBController.DeviceID=\'"をqにセット. q = q + argv[1]; // argv[1]を連結. q = q + L"\'}"; // "\'}"を連結. BSTR strQueryLanguage = SysAllocString(L"WQL"); // SysAllocStringでstrQueryLanguageを"WQL"で初期化. BSTR strQuery = SysAllocString(q.c_str()); // SysAllocStringでstrQueryをq.c_str()で初期化. hr6 = pServices->ExecQuery(strQueryLanguage, strQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); // IWbemServices::ExecQueryでクエリ実行. if (FAILED(hr6)){ // FAILEDマクロで判定.
引数で渡すことにした。
DeviceIDは、ダブルクォートで囲み、しかもエスケープの'\'によって二重になってるから1つにする。
成功した。
"DeviceIDに関連する"というところがキモなのかな・・・難しい・・・。
Win32_PnPEntryはBLEとかいろんなデバイスがたくさん出てくる。
Win32_USBHubや、
Win32_IRQResource、
Win32_DeviceMemoryAddress、
Win32_ComputerSystemなど、関連するあらゆるものが出てくる・・・。
ResultClassにWin32_USBHubを指定すると、
Win32_USBHubだけに絞り込める。
Sample/wmi/ASSOCIATORS_OF/ResultClass/src/ASSOCIATORS_OF at master · bg1bgst333/Sample · GitHub