您的位置:首页 > 编程语言 > C语言/C++

【WMI-3】WMI For C++/COM 查询信息

2008-11-26 11:26 239 查看
查询信息
        WMI最主要的一个功能就是在WMI储备库里查询一些类和实例的信息,我们可以调用一个同步查询,也可以调用一个异步查询。
        同步查询是在当前进行下执行的查询;异步查询则需要启动另一个线程去查询,在查询工作结束后,调用定义好的接口(类似于回调函数),以处理查询结果。
        同步查询适合于查询本机系统或其他一些小的应用;当查询的工作量很大的时候,同步查询可能会造成资源的等待, 所以对于应用于网络的查询和大量查询的时候,异步查询是更好的选择。
1)同步查询
        同步查询需要的COM类型是IWbemServices,方法是ExecQuery,我们需要做的是将一个编辑好的WQL查询字符串作为参数传递给该方法,该方法返回一个IEnumWbemClassObject类型的指针,该类型的指针保存了我们查询的结果集。利用这个结果集,我们可以调用IEnumWbemClassObject::Next函数遍历结果集,然后选择我们确切需要的数据。


        IEnumWbemClassObject* pEnumerator = NULL;


    hres = pSvc->ExecQuery(


        bstr_t("WQL"), 


        bstr_t("SELECT * FROM Win32_BIOS"),


        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 


        NULL,


        &pEnumerator);




    if (FAILED(hres))




    ...{


        cout << "Query for operating system name failed."


            << " Error code = 0x" 


            << hex << hres << endl;


        pSvc->Release();


        pLoc->Release();


        CoUninitialize();


        return 1;               // Program has failed.


    }




    // 遍历


    IWbemClassObject *pclsObj;


    ULONG uReturn = 0;


    while (pEnumerator)




    ...{


        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 


            &pclsObj, &uReturn);




        if(0 == uReturn)




        ...{


            break;


        }




        VARIANT vtProp;


        VariantInit(&vtProp);




        // 取得BIOS序列号


        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);


        wcout << " BIOS SerialNumber : " << vtProp.bstrVal << endl;


        // 取得BIOS版本


        hr = pclsObj->Get(L"Version", 0, &vtProp, 0, 0);


        wcout << " BIOS Version : " << vtProp.bstrVal << endl;




        VariantClear(&vtProp);


    }


2)异步查询
        异步查询同样需要COM类型IWbemServices,方法是ExecQueryAsync。该方法会从当前查询WMI储备库的进程中转移到另一个线程,使另一个查询工作得以进行。WMI会调用实现了IWbemSinkObject接口的类型的Indicate方法来通知程序,查询结束,并像同步查询一个样,将查询的结果集以一个IEnumWbemClassObject类型的指针返回给用户。
        以下代码只演示异步查询的方法,但是响应查询结果的方法在自定义类QuerySink中,由于篇幅限制,请在MSDN中查找。


    // Create a new sink object.


    QuerySink *pSink = new QuerySink;




    // Initialize the query and query language.


    BSTR strQuery = SysAllocString(L"SELECT * FROM ClassName");


    BSTR strQueryLang = SysAllocString(L"WQL");


    


    // Issue the query.


    HRESULT hRes = pSvc->ExecQueryAsync(strQueryLang, strQuery, 0,


        NULL, pSink);




    // Clean up.


    SysFreeString(strQuery);


    SysFreeString(strQueryLang);


    


    if (hRes)




    ...{


        printf("ExecQueryAsync failed with = 0x%X ", hRes);


        return;


    }


    


    printf("Completed. ");

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 工作 null 网络