wmi를 이용하여 Win32_PhysicalMemory의 MemoryType 프로퍼티(?)에 접근하여
램이 ddr2인지 ddr3인지를 구별하려고 하는데
ddr2 피씨에서 테스트를해도 관련 리턴값이 자꾸 0이 나와버리네
대략적인 소스는 아래와
int CKHWComponents::SetMemoryType(void)
{
HRESULT hres;
IEnumWbemClassObject* pEnumerator = NULL;
CComBSTR bstrQryLang("WQL");
CComBSTR bstrQuery("SELECT * FROM Win32_PhysicalMemory");
hres = m_pWbemSvc->ExecQuery(bstrQryLang, bstrQuery, 0, NULL, &pEnumerator);
//WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hres)) {
KLOG(KERROR_WMI_QUERY_FAIL, "KERROR_WMI_QUERY_FAIL - Error[%d] \n\tQuery - [SELECT * FROM Win32_PhysicalMemory]\n", hres);
TRACE(_T("Query failed. Error code = %x - Win32_PhysicalMemory\n"), hres);
m_pWbemSvc->Release();
m_pWbemLoc->Release();
return -1;
}
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
VARIANT vtProp;
CString strTemp;
int iTemp;
int iSlotNum = 0;
CString strTmp = _T("");
while(true)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (uReturn == 0)
break;
iSlotNum++;
//Get DeviceLocator
VariantInit(&vtProp);
if(hres = pclsObj->Get(L"MemoryType", 0, &vtProp, 0, 0) != S_OK)
{
AfxMessageBox(_T("FAILED GET!"));
break;
}
if (vtProp.vt != VT_EMPTY )
{
strTemp = "";
if( vtProp.vt != VT_NULL )
{
strTmp.Format(_T("%s"),(LPCSTR)vtProp.bstrVal);
unsigned int nMemoryTypeValue = _wtoi(strTmp);
nMemoryTypeValue = vtProp.uintVal;
//vtProp.intVal
switch(nMemoryTypeValue)
{
case 20 :
strTmp = "DDR Memory";
break;
case 21 :
strTmp = "DDR2 Memory";
break;
default:
if(nMemoryTypeValue >= 1 && nMemoryTypeValue <= 19)
{
strTmp = "non DDR Memory";
}
else
{
strTmp = "DDR3";
}
break;
}
}
}
}
읽어오는데 까지는 성공하는데 vtProp.bstrVal 값은 null이 되버리고
uIntVal 값은 계속 0만 가져오네
당췌 어떤부분이 문제인지 모르겠네
아는횽 도움 주셨으면
댓글 0