用WMI获取磁盘硬件信息

#include "stdafx.h"
using namespace std;
#include <comdef.h>
#include <comutil.h>
#include <Wbemidl.h>
#pragma comment ( lib, "wbemuuid.lib" )
IWbemServices *pSvc = NULL;
IWbemLocator *pLoc = NULL;
IWbemClassObject* pclsObj = NULL;
IEnumWbemClassObject* pEnum = NULL;
HRESULT hres;
int DiskNumber( const char* strSQL, const char* strAttr )
{
    hres = pSvc->ExecQuery( bstr_t( "WQL" ), bstr_t( strSQL ), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum );
    if( FAILED( hres ) )
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
    ULONG uReturn = 0;
    while( pEnum )
    {
        HRESULT hr = pEnum->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn );
        if( 0 == uReturn )
        {
            break;
        }
        VARIANT vtProp;
        VariantInit( &vtProp );
        vtProp.vt = VT_BSTR;
        vtProp.bstrVal = SysAllocString( L"" );
        hr = pclsObj->Get( bstr_t( strAttr ), 0, &vtProp, 0, 0 );
        if( FAILED( hr ) )
        {
            printf( "Error, HRESULT = %d, severity = %d, facility = %d, code = %d\n",
                hr, HRESULT_SEVERITY( hr ), HRESULT_FACILITY(hr), HRESULT_CODE(hr) );
            CComQIPtr < ISupportErrorInfo > spSEI = pclsObj;
            if( spSEI )
            {
                hr = spSEI->InterfaceSupportsErrorInfo( IID_ISupportErrorInfo );
                if( SUCCEEDED( hr ) )
                {
                    CComQIPtr < IErrorInfo > spErrInfo;
                    hr = GetErrorInfo( 0, &spErrInfo );
                    if( SUCCEEDED( hr ) )
                    {
                        CComBSTR bstrDes;
                        spErrInfo->GetDescription( &bstrDes );
                        printf( "Com error = %s\n", _com_util::ConvertBSTRToString( (BSTR)bstrDes ) );
                    }
                }
            }
            continue;
        }
        char* strNumber = _com_util::ConvertBSTRToString( vtProp.bstrVal );
        printf( "Disk information : %s, length = %d \n", strNumber, strlen( strNumber ) );
        delete [] strNumber;
        VariantClear( &vtProp );
    }
    return 0;
}
int main( int argc, char* argv[] )
{
    hres = CoInitializeEx( 0, COINIT_MULTITHREADED );
    if( FAILED( hres ) )
    {
        return 1;
    }
    hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
    if( FAILED( hres ) )
    {
        CoUninitialize();
        return 1;
    }
    hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, ( LPVOID* )&pLoc );
    if( FAILED( hres ) )
    {
        CoUninitialize();
        return 1;
    }
    hres = pLoc->ConnectServer( _bstr_t( "ROOT\\CIMV2" ), NULL, NULL, 0, NULL, 0, 0, &pSvc );
    if( FAILED( hres ) )
    {
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
    int ret = 0;
    ret |= DiskNumber( "SELECT * FROM Win32_DiskDrive", "PNPDeviceID" );
    ret |= DiskNumber( "SELECT * FROM Win32_PhysicalMedia", "SerialNumber" );
    if( ret )
    {
        printf( "Get Hard disk information failed\n" );
        return 1;
    }
    if( pSvc )
    {
        pSvc->Release();
        pSvc = NULL;
    }
    if( pLoc )
    {
        pLoc->Release();
        pLoc = NULL;
    }
    if( pEnum )
    {
        pEnum->Release();
        pEnum = NULL;
    }
    if( pclsObj )
    {
        pclsObj->Release();
        pclsObj = NULL;
    }
    CoUninitialize();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值