wmi获取主板型号在有些机器上获取不准。
BOOL GetWMIValueStr( IWbemServicesPtr pSvc,BSTR bstrClass, BSTR bstrField, CString & bstrValue)
{
BOOL bReturn = FALSE;
HRESULT hres = E_FAIL;
_variant_t varValue;
_bstr_t strQuery( "SELECT * FROM " ); // Prefix for WMI class selection
_bstr_t strResult;
long nStrLength = 0; // Used to determine the size of wcharTempStr
ULONG ulCount = 1; // Number of requested objects
ULONG ulReturned = 0; // Number of returned objects
IEnumWbemClassObject * pEnum = NULL; // Pointer to WMI class
IWbemClassObject * pWbemObject = NULL; // Pointer to WMI object
const LONG RESERVED_FLAG = 0; // Reserved value, must be 0
if (pSvc == NULL)
return bReturn;
// Attach the class to query to the prefix
strQuery += bstrClass;
try
{
if (FAILED(hres = pSvc->ExecQuery( _bstr_t("WQL"),
strQuery,
WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum)) ||
FAILED(hres = pEnum->Next(WBEM_NO_WAIT, ulCount, &pWbemObject,&ulReturned)) ||
(ulReturned != ulCount))
{
throw L" pSvc->ExecQuery_FAILED or pEnum->Next FAILED";
}
// Retrieve the field (last two args are optional and can be NULL)
if (FAILED(hres = pWbemObject->Get(bstrField , RESERVED_FLAG,
&varValue, NULL, NULL)))
{
throw L"pWbemObject->Get FAILED!";
}
if (varValue.vt == VT_NULL)
{
throw L"The value is NULL,varValue.vt == VT_NULL";
}
else
{
strResult = varValue;
bstrValue =strResult.copy();
bReturn = TRUE;
}
}
catch (WCHAR * sz)
{
DBG_PRINTW(sz);
}
if(pWbemObject!=NULL)
{
pWbemObject->Release(); // Release the WMI objects
}
if (pEnum !=NULL)
{
pEnum->Release();
}
return bReturn;
}
BOOL GetBaseBoardModel( CString &strModel)
{
BOOL bReturn = FALSE;
IWbemLocatorPtr pLoc; // Pointer to WMI namespace
IWbemServicesPtr pSvc; // Pointer to access WMI services
HRESULT hr = E_FAIL;
_bstr_t strPath = L"ROOT\\CIMV2"; // WMI root path
// Initialize COM
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
try
{
if (FAILED(hr = pLoc.CreateInstance(CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER)) ||
FAILED(hr = pLoc->ConnectServer(strPath, NULL, NULL, 0, NULL,
0, 0, &pSvc)) ||
FAILED(hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE)) )
{
throw L"failed to get WMI initialize to use";
}
if (SUCCEEDED(hr = GetWMIValueStr(pSvc,L"Win32_ComputerSystem",L"Model", strModel)))
{
bReturn = TRUE;
}
}
catch (WCHAR* sz)
{
DBG_PRINTW(sz);
}
// close COM and release all COM pointer
pSvc = NULL;
pLoc = NULL;
CoUninitialize();
// return status code for Intel BIOS
return bReturn;
}
void main()
{
CString str;
GetBaseBoardModel(str);
MessageBox(NULL,str,str,MB_OK);
}
打印出来的在某些机器上主板型号不对。
后面我把上面的GetWMIValueStr(pSvc,L"Win32_ComputerSystem",L"Model", strModel)换成
GetWMIValueStr(pSvc,L"Win32_BaseBoard",L"Model", strModel),结果读出来型号为空。
请问各位是否有其他的更好的方式读主板型号。