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만 가져오네

 

당췌 어떤부분이 문제인지 모르겠네

 

아는횽 도움 주셨으면