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

 查询信息
        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, 00);
        wcout 
<< " BIOS SerialNumber : " << vtProp.bstrVal << endl;
        
// 取得BIOS版本
        hr = pclsObj->Get(L"Version"0&vtProp, 00);
        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. " );
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值