Click here to Skip to main content
Click here to Skip to main content

Getting Information from WMI in Visual C++

By , 27 Sep 2011
 

Introduction

We normally find a lot of ways and a number of resources to use WMI or to get information from “Windows Management Instrumentation” while using Visual Basic 6 and C#, but I could not find a single resource describing the same thing in Visual C++. MSDN resources are also very limited in this context.

Code

Following is the code on how to get the current processor load from a WMI class Win32_Processor defined in a .mof file. .mof files are managed object files which have a typical way of defining classes and methods.

WMI provides the COM service which is used to connect to the WMI services. The important parts of the code include:

  • bstrNamespace: The initialization of this variable is very tricky. The first three forward slashes //./ represent the Host Computer name from which you want to get information from. A “.” Indicates that information is to be obtained from the same computer on which you are working. You can give any network name here but getting information from the network depends upon your Access Rights, etc. cimv2 is the namespace containing the Win32_Processor class.
  • pIWbemLocator is the argument in which we get the Interface pointer.
  • After that, we call the function ConnectServer of the pIWbemLocator to get a pointer to pWbemServices.
  • WMI uses its own Query Language to get information known as WQL (the acronym for WMI Query Language). So, when calling the function ExecQuery, we have to specify the language as its first argument. Second argument is the Query itself. Last argument is important because here we get a pointer to an Enumeration object through which we can enumerate through the objects available. This enumeration is important because consider the case that we want to know the information about running processes and we are using Win32_Process class for this purpose. Then through this enumeration object, we can go through different processes one by one.
  • By calling the Reset and Next methods of pEnumObject, we are moving through the objects. We get the pointer to an object in pClassObject.
  • The last function through which we get the actual value of a property is Get. We pass a BSTR to this function to get the value in a variant.

The code for getting Processor Load is in a thread which keeps on running and posts message to UI to update the Progress bar. Here is the Thread function.

UINT GetProcessorLoad( LPVOID pParam )
{
	CUsingWMIDlg* dlg = (CUsingWMIDlg*)pParam;
	
	CoInitialize(NULL);

	HRESULT hRes = CoInitializeSecurity( NULL, -1, NULL, 
		NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL,
		EOAC_NONE, 0);

	if(hRes != S_OK) return 0;

	CComPtr<iwbemlocator> pIWbemLocator;
	CComPtr<iwbemservices> pIWbemServices;
	CComPtr<ienumwbemclassobject> pIEnumObject;

	CComBSTR bstrNamespace(_T("root\\cimv2"));

	hRes = pIWbemLocator.CoCreateInstance(CLSID_WbemAdministrativeLocator);
	if(hRes != S_OK) return 0;

	hRes = pIWbemLocator->ConnectServer(bstrNamespace, NULL, 
		NULL, NULL, 0, NULL, NULL, &pIWbemServices);
	if(hRes != S_OK) return 0;

	while(true)
	{
		CComBSTR bstrQuery(_T("Select * from Win32_Processor"));
		CComBSTR bstrQL(_T("WQL"));

		hRes = pIWbemServices->ExecQuery
		(bstrQL, bstrQuery, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pIEnumObject);

		ULONG uCount = 1, uReturned;
		CComPtr<iwbemclassobject> pIClassObject;

		hRes = pIEnumObject->Reset();

		hRes = pIEnumObject->Next
		(WBEM_INFINITE, uCount, &pIClassObject, &uReturned);

		if(hRes != S_OK) return 0;

		CComVariant var;

		CComBSTR bstrProp(_T("LoadPercentage"));

		hRes = pIClassObject->Get(bstrProp, 0, &var, NULL, NULL);
		if(hRes != S_OK) return 0;

		int * value = new int(var.lVal);
		dlg->PostMessage(WM_USER+1, (WPARAM) value);
		
		pIEnumObject.Release();
	}
	return 1;
}

Conclusion

This was the shortest method I was able to work out to get information from any WMI class. You can simply change the class name in the Query and Property Name while calling Get method and you will get information from all the classes supported in your OS. I have now tested this code in Windows 7, Windows XP, Win2000, Win2003 and Win2008.

Update

I found out that the code associated with this article was very badly written. After all, I did this when I was a student. Now that I know a tiny bit more, I am updating the code. I have now used Smart Pointers and I have also updated the example App to show the Processor load in a Progress Bar. Furthermore, this is now a Visual Studio 2008 project.
Another fix was to add a lib file in linker settings.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Aamir Butt
Technical Lead
Pakistan Pakistan
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralWeak CodemvpElmue2 Sep '10 - 16:45 
GeneralRe: Weak Code [modified]memberBlake Miller22 Sep '10 - 11:26 
GeneralRe: Weak CodemvpElmue22 Sep '10 - 15:34 
GeneralError while compilingmemberBhaskartrivedi25 Aug '08 - 8:32 
GeneralRe: Error while compilingmemberPriya_Sundar1 Apr '09 - 0:59 
GeneralMissing code..memberChizI23 May '08 - 5:08 
GeneralUnable to make remote Connectionmemberanushka.babu16 Apr '08 - 22:33 
Generalnot working under win 2k envmemberbhanu_codeproject21 Nov '07 - 19:49 
GeneralRe: not working under win 2k envmemberUserMarcus24 Sep '08 - 3:02 
GeneralRe: not working under win 2k envmemberUserMarcus2 Oct '08 - 4:22 
GeneralIn the first attenpt itself it has workedmemberbhanu_codeproject20 Nov '07 - 23:47 
QuestionHow to call WMI in MFC Externsion DLLmemberyoungkwan song30 Aug '07 - 21:03 
GeneralAccessing IE settings in VistamemberDana Daugherty11 Jun '07 - 22:10 
GeneralMissing DLL and header filesmemberPeterLeblang22 Jan '07 - 1:54 
GeneralRe: Missing DLL and header filesmemberAamir Butt22 Jan '07 - 18:26 
GeneralHelp me please to recognize situation by using WMImembermaria.net7 Aug '06 - 3:07 
QuestionI got the same errormemberhoker.ffb3 Jul '06 - 23:34 
General#define _WIN32_DCOMmemberSpitfireX16 May '06 - 1:57 
GeneralRe: #define _WIN32_DCOMmembertyjjrtruy4teqye7nyue7qay8 Jan '07 - 20:33 
GeneralRe: #define _WIN32_DCOMmemberti-oh16 Jan '07 - 23:28 
GeneralIP Addressmemberdianalexander9 Feb '06 - 21:19 
GeneralRe: IP AddressmemberAamir Butt12 Feb '06 - 17:24 
GeneralRe: IP Addressmembermcxiand15 May '06 - 20:58 
GeneralRe: IP AddressmemberOrkblutt5 Oct '06 - 2:32 
Generalunhandled Win32 exceptionmemberIronic26623 Nov '05 - 21:27 
GeneralRe: unhandled Win32 exceptionmemberAamir Butt24 Nov '05 - 18:45 
GeneralRe: unhandled Win32 exceptionmemberIronic26626 Nov '05 - 22:32 
GeneralConnect to several namespacesmemberangelzoo14 Nov '05 - 2:39 
GeneralRe: Connect to several namespacesmemberAamir Butt24 Nov '05 - 18:53 
GeneralRe: Connect to several namespacesmemberangelzoo24 Nov '05 - 22:09 
QuestionMissing CoInitializeSecurity?membertikcireviva27 Sep '05 - 0:34 
AnswerRe: Missing CoInitializeSecurity?memberAamir Butt24 Nov '05 - 18:55 
GeneralRe: Missing CoInitializeSecurity?memberkeithlee27 Feb '06 - 9:50 
AnswerRe: Missing CoInitializeSecurity?memberxiaozhijian11 Jan '06 - 20:44 
GeneralRe: Missing CoInitializeSecurity?memberZenith6315 Jul '07 - 9:17 
GeneralRe: Missing CoInitializeSecurity?memberMember 376488919 Jul '11 - 18:14 
Questionhow to connect romote hostmemberwesley424812 May '05 - 15:36 
AnswerRe: how to connect romote hostmemberAamir Butt24 Nov '05 - 19:01 
Generalwbemuuid.lib - CoCreateInstance problemmemberviswanath_jntu9 Mar '05 - 19:13 
GeneralRe: wbemuuid.lib - CoCreateInstance problemmemberPeter Beecken18 Nov '05 - 2:44 
GeneralRe: wbemuuid.lib - CoCreateInstance problemmemberJNygren11 Apr '07 - 5:37 
GeneralRe: wbemuuid.lib - CoCreateInstance problemmemberpilixuanke8 May '07 - 3:09 
Generalwbemuuid.lib - error :object file corruptedmemberviswanath_jntu9 Mar '05 - 18:06 
GeneralWin32_OperatingSystemmember<>7 Mar '05 - 6:10 
GeneralRe: Win32_OperatingSystemmembersmartceo6 Jun '07 - 20:05 
GeneralRe: Win32_OperatingSystemmemberdon_francc15 Sep '10 - 19:32 
Generalwin2k error!!!memberiicastle30 Jan '05 - 22:07 
GeneralRe: win2k error!!!memberAamir Butt30 Jan '05 - 22:14 
GeneralProblem under Win2KmemberAxelHecker3 Jan '05 - 4:38 
Questionwhere to get Wbemcli.h?memberalfredosp6 Oct '04 - 9:08 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 27 Sep 2011
Article Copyright 2004 by Aamir Butt
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid