C++ + WMI + DDK 实现获得显卡信息 代码

本文介绍如何使用VC++ 2005通过WMI (Windows Management Instrumentation) 查询并打印计算机上的显卡信息,包括PNP设备ID、适配器RAM及描述等属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Build   it   in   VC++   2005   with   the   following   command 
//   cl   /Zc:wchar_t-   videocontroller.cpp 
//   by   Onega(www.fruitfruit.com) 
#define   _WIN32_DCOM 
#include   
<Wbemidl.h> 
#pragma   comment(lib, "Wbemuuid.lib ") 
#include   
<atlbase.h> 
#include   
"objbase.h " 
#include   
<windows.h> 
#include   
<comutil.h> 
#pragma   comment(lib,   "comsupp.lib ") 
#include   
<iostream> 

void   print_property(CComBSTR   bstrPropName,   _variant_t&   varProperty) 

    std::cout 
< < "     " < <(LPCTSTR)_bstr_t(bstrPropName); 
    std::cout 
< < "   =   "

    
if(varProperty.vt   !=VT_EMPTY   &&   VT_NULL   !=   varProperty.vt) 
    

        _variant_t   vDest; 
        HRESULT   hr   
=   VariantChangeType(&vDest,   &varProperty,0,VT_BSTR); 
        
if(SUCCEEDED(hr)) 
            std::cout 
< <   (LPCTSTR)_bstr_t(varProperty); 
        
else 
        

            
if(varProperty.vt   ==   (VT_ARRAY   |   VT_I4)   ) 
            

                SAFEARRAY
*   psa   =   varProperty.parray; 
                
int   *pIntArray   =   NULL; 
                SafeArrayAccessData(psa,(VOID
**)&pIntArray); 
                UINT   uDim   
=   SafeArrayGetDim(psa); 
                
if(1==uDim) 
                

                    
long   lLbound,lRbound; 
                    SafeArrayGetLBound(psa,
1,&lLbound); 
                    SafeArrayGetUBound(psa,
1,&lRbound); 
                    
for(long   i=lLbound;i <=lRbound;i++
                    

                        std::cout 
< <   pIntArray[i] < < "   "
                    }
 
                }
 
                SafeArrayUnaccessData(psa); 
            }
 
            
else 
            

                std::cout 
< <   varProperty.vt   < <   "   type   "
            }
 
        }
 
    }
 
    
else 
    

        
if(varProperty.vt   ==   VT_EMPTY) 
            std::cout 
< <   "VT_EMPTY   "
        
else 
            std::cout 
< <   "VT_NULL "
    }
 
    std::cout 
< <std::endl; 
}
 

int   main() 

    CoInitialize(NULL); 
    

        HRESULT   hr   
=   S_OK; 
        CComPtr 
<IWbemLocator>   spLoc; 
        hr   
=   spLoc.CoCreateInstance(CLSID_WbemLocator); 
        CComBSTR   bstrNamespace( 
"//./root/CIMV2 "); 
        CComPtr 
<IWbemServices>   spServices; 
        hr   
=   spLoc-> ConnectServer(bstrNamespace,   NULL,   NULL,   0
            NULL,   
0,   0,   &spServices); 
        hr   
=   CoSetProxyBlanket(spServices,   RPC_C_AUTHN_DEFAULT, 
            RPC_C_AUTHZ_NONE,   NULL,   RPC_C_AUTHN_LEVEL_CALL, 
            RPC_C_IMP_LEVEL_IMPERSONATE,   NULL,   EOAC_NONE); 
        

            CComPtr 
<IEnumWbemClassObject>   spEnumInst; 
            hr   
=   spServices-> CreateInstanceEnum(CComBSTR( "Win32_VideoController "), 
                WBEM_FLAG_SHALLOW,   NULL,   
&spEnumInst); 
            
bool   bFinished   =   false
            
while   (!bFinished) 
            

                ULONG   uNumOfInstances   
=   0
                CComPtr 
<IWbemClassObject>   spInstance; 
                HRESULT   hrNext   
=   spEnumInst-> Next(10000,   1,   &spInstance, 
                    
&uNumOfInstances); 
                
if   (hrNext   ==   WBEM_S_FALSE) 
                    bFinished   
=   true
                
else   if   (hrNext   ==   WBEM_S_NO_ERROR) 
                

                    
//PrintObject(spInstance); 
                    _variant_t   varProperty; 
                    CComBSTR   bstrPropName; 
                    bstrPropName   
=   CComBSTR( "PNPDeviceID "); 
                    hr   
=   spInstance-> Get(bstrPropName,0,&varProperty,NULL,0); 
                    print_property(bstrPropName,varProperty); 
                    bstrPropName   
=   CComBSTR( "AdapterRAM "); 
                    hr   
=   spInstance-> Get(bstrPropName,0,&varProperty,NULL,0); 
                    print_property(bstrPropName,varProperty); 
                    bstrPropName   
=   CComBSTR( "Description "); 
                    hr   
=   spInstance-> Get(bstrPropName,0,&varProperty,NULL,0); 
                    print_property(bstrPropName,varProperty); 

                }
 
            }
 
        }
 
    }
 
    std::cout 
< <   "finished   " < <std::endl; 
    CoUninitialize(); 
    system( 
"pause "); 
    
return   0
}
 
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值