wmi获取主板型号在有些机器上获取不准。

realali 2008-01-22 10:33:32

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),结果读出来型号为空。
请问各位是否有其他的更好的方式读主板型号。


















...全文
301 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧