//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;
}

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





