1. 程式人生 > >c++通過wmi獲得Win32_DiskDrive裡面的CapabilityDescriptions等引數

c++通過wmi獲得Win32_DiskDrive裡面的CapabilityDescriptions等引數

//查詢硬碟
//char b[]=“Here is the DiskDrive information:”;
char b[]=“硬碟的資訊如下:”;

printf("\n\n %s",b);
pEnumerator->Release(); 
pEnumerator=NULL;

hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_DiskDrive where SCSILogicalUnit = 0"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL,&pEnumerator); //查詢有效的電池資訊
if (FAILED(hres))
{
    cout << ";;Query failed. "<< "Error code = 0x" << hex << hres << endl;
    pSvc->Release();
    pLoc->Release();     
    CoUninitialize();
    return 1;               // Program has failed.查詢失敗
}
while (pEnumerator)
{
       
    hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);  //Next函式

    if((0 == uReturn)||(0 == pclsObj))
       // if(0 == uReturn)

     {
            break;
     }
        
	//獲取欄位的值
	VARIANT DisID;
	VARIANT DisDp;
	VARIANT DisCap;
	VARIANT DisMo;
	VARIANT DisMan;
	VARIANT DisSN;
	VARIANT DisD;
	VARIANT DisCD;
	VARIANT DisMBS;
	VARIANT DisMiBS;
	VARIANT DisSPT;
	VARIANT DisTC;
	VARIANT DisTH;
	VARIANT DisTS;
	VARIANT DisTT;
	VARIANT DisTPC;
	VARIANT DisFR;
	VARIANT DisIT;
	VARIANT Disize;
	
	//DisCD.bstrVal=0;	
	DisD.bstrVal=0;
	DisID.bstrVal=0;
	DisMBS.bstrVal=0;
	DisMiBS.bstrVal=0;
	DisSPT.bstrVal=0;
	DisTC.bstrVal=0;
	DisTH.bstrVal=0;
	DisTS.bstrVal=0;
	pclsObj->Get(L"DeviceID",0,&DisID,0,0);			
	printf("\n DeviceID:%ls",DisID.bstrVal);    // 裝置名稱 string,值為\\.\PHYSICALDRIVED
	pclsObj->Get(L"Description",0,&DisDp,0,0);			
	printf("\n Description:%ls",DisDp.bstrVal);  //裝置描述 string
	pclsObj->Get(L"Caption",0,&DisCap,0,0);			
	printf("\n Caption:%ls",DisCap.bstrVal);    //裝置說明 string
	pclsObj->Get(L"Model",0,&DisMo,0,0);			
	printf("\n Model:%ls",DisMo.bstrVal);    //硬碟名稱 string
	pclsObj->Get(L"Manufacturer",0,&DisMan,0,0);			
	printf("\n Manufacturer:%ls",DisMan.bstrVal);  //生產廠家 string
	pclsObj->Get(L"SerialNumber",0,&DisSN,0,0);			
	printf("\n SerialNumber:%ls",DisSN.bstrVal);  //硬碟序列號 string
    
	pclsObj->Get(L"CapabilityDescriptions",0,&DisCD,0,0);	 //因為CapabilityDescriptions是二維的指標safearray,所以不能用printf直接輸出,要通過緩衝區把字串儲存下來再輸出
	 
	BSTR   (*buf)[2]=NULL;  		

	if(FAILED(SafeArrayAccessData(DisCD.parray,  (void  **)&buf)))
	::MessageBoxA(NULL,"出毛病了。","提示",MB_OK   |   MB_ICONWARNING);   

	/*string str = _com_util::ConvertBSTRToString((*buf)[0]); 
	string str1 = _com_util::ConvertBSTRToString((*buf)[1]); 
	
	printf("\n CapabilityDescriptions:");	*/
	_tprintf(_T("\n********** CapabilityDescriptions:%ls"),*buf[0]);	
	_tprintf(_T("\n********** CapabilityDescriptions:%ls"),(*buf)[1]);	
/*	printf("\n  %s",str.c_str());
	printf("\n  %s",str1.c_str());*/		
	SafeArrayUnaccessData(DisCD.parray);   
	/*pclsObj->Get(L"Capabilities",0,&DisCD,0,0);	
	printf("\n CapabilityDescriptions:%d",DisCD.bVal);*/
			
	pclsObj->Get(L"DefaultBlockSize",0,&DisD,0,0);
	
	printf("\n DefaultBlockSize:%ls",DisD.bstrVal);   //硬碟預設分塊大小  uint64
	
	pclsObj->Get(L"MaxBlockSize",0,&DisMBS,0,0);			
	printf("\n MaxBlockSize:%ls",DisMBS.bstrVal);    //硬碟最大分塊大小 
	pclsObj->Get(L"MinBlockSize",0,&DisMiBS,0,0);			
	printf("\n MinBlockSize:%ls",DisMiBS.bstrVal);    //硬碟最小分塊大小
	pclsObj->Get(L"SectorsPerTrack",0,&DisSPT,0,0);			
	printf("\n SectorsPerTrack:%d",DisSPT.bstrVal);    //硬碟扇區數  UInt32 
	pclsObj->Get(L"TotalCylinders",0,&DisTC,0,0);			
	printf("\n TotalCylinders:%ls",DisTC.bstrVal);    //硬碟柱面數 uinit64
	pclsObj->Get(L"TotalHeads",0,&DisTH,0,0);			
	printf("\n TotalHeads:%d",DisTH.bstrVal);     //磁碟總頭數  UInt32
	pclsObj->Get(L"TotalSectors",0,&DisTS,0,0);			
	printf("\n TotalSectors:%ls",DisTS.bstrVal); //磁碟扇區數    uinit64
	pclsObj->Get(L"TotalTracks",0,&DisTT,0,0);
	//DisTT.bstrVal=0;
	printf("\n TotalTracks:%ls",DisTT.bstrVal);  //磁碟總道數  uinit64
		/*pclsObj->Get(L"TracksPerCylinder",0,&DisID,0,0);
		DisID.bstrVal=0;
		printf("\n TracksPerCylinder:%ls",DisID.bstrVal);		*/
	pclsObj->Get(L"TracksPerCylinder",0,&DisTPC,0,0);
	//DisTPC.bstrVal=0;
	printf("\n TracksPerCylinder:%d",DisTPC.intVal);   //每柱磁軌數 uinit32
	pclsObj->Get(L"FirmwareRevision",0,&DisFR,0,0);			
	//DisFR.bstrVal=0;
	printf("\n FirmwareRevision:%ls",DisFR.bstrVal);   //韌體版本  string
	pclsObj->Get(L"InterfaceType",0,&DisIT,0,0);			
	printf("\n InterfaceType:%ls",DisIT.bstrVal);    //介面型別  string
	pclsObj->Get(L"Size",0,&Disize,0,0);			
	printf("\n Size:%ls",Disize.bstrVal);    //硬碟容量   uint 64
	//
	
	VariantClear(&DisID);

	VariantClear (&DisDp);
	VariantClear (&DisCap);
	VariantClear (&DisMo);
	VariantClear (&DisMan);
	VariantClear (&DisSN);
	VariantClear (&DisD);
	VariantClear (&DisCD);
	VariantClear (&DisMBS);
	VariantClear (&DisMiBS);
	VariantClear (&DisSPT);
	VariantClear (&DisTC);
	VariantClear (&DisTH);
	VariantClear (&DisTS);
	VariantClear (&DisTT);
	VariantClear (&DisTPC);
	VariantClear (&DisFR);
	VariantClear (&DisIT);
	VariantClear (&Disize);
	pclsObj->Release();
}