Advertisement Jump to content
Sign in to follow this  


This topic is 4884 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am trying to use the MEMORYSTATUSEX structure to get memory info. Everything gets put into the structure correctly, it seems, when I use GlobalMemoryStatusEx. However, when I use wsprintf to put the info into a char array it shows all the available memory members as 0 if I use %ld, %lu, or %d. I looked at the help on MSDN and they use %*I64d with a WIDTH constant of 7. It displays the actual numbers, except a couple numbers display as something like: 1fff80 and 1fe770 I have never seen %*I64d used before, but it seems that without using that I cannot display the memory correctly. Is this a right presumption, or am I doing something wrong? Here are both methods, mine and the modified MSDN version:
	const int DIV = 1024;
	const int WIDTH = 7;
	const char* divisor = "K";
	char memInfo[5000];

	statex.dwLength = sizeof (MEMORYSTATUSEX);

	GlobalMemoryStatusEx (&statex);
        //my version
	sprintf (memInfo,	"%ld percent of memory is in use.\n"
			        "There are %d total Kbytes of physical memory.\n"
				"There are %d free Kbytes of physical memory.\n"
				"There are %lu total Kbytes of paging file.\n"
				"There are %lu free Kbytes of paging file.\n"
				"There are %lu total Kbytes of virtual memory.\n"
			        "There are %lu free Kbytes of virtual memory.\n",	
	MessageBox(NULL, memInfo, "Memory Information", MB_OK|MB_ICONINFORMATION);
	char one[50], two[50], three[50], four[50], five[50], six[50], seven[50], eight[50];
        //MSDN version (they use printf and do it on multiple lines, so I 
        //left it in the same format and combined all the info into one variable
        //I know there are easier and/or better ways around this, I just did it this way to keep it as close to their version as I could (or something)
	sprintf (one, "%ld percent of memory is in use.\n",
	sprintf (two, "There are %*I64d total %sbytes of physical memory.\n",
          WIDTH, statex.ullTotalPhys/DIV, divisor);
	sprintf (three, "There are %*I64d free %sbytes of physical memory.\n",
          WIDTH, statex.ullAvailPhys/DIV, divisor);
	sprintf (four, "There are %*I64d total %sbytes of paging file.\n",
          WIDTH, statex.ullTotalPageFile/DIV, divisor);
	sprintf (five, "There are %*I64d free %sbytes of paging file.\n",
          WIDTH, statex.ullAvailPageFile/DIV, divisor);
	sprintf (six, "There are %*I64x total %sbytes of virtual memory.\n",
		  WIDTH, statex.ullTotalVirtual/DIV, divisor);
	sprintf (seven, "There are %*I64x free %sbytes of virtual memory.\n",
		  WIDTH, statex.ullAvailVirtual/DIV, divisor);
	sprintf (eight, "There are %*I64x free %sbytes of extended memory.\n",
		WIDTH, statex.ullAvailExtendedVirtual/DIV, divisor);

	sprintf(memInfo, "%s %s %s %s %s %s %s %s", one, two, three, four, five, six, seven, eight);

	MessageBox(NULL, memInfo, "Memory Information", MB_OK|MB_ICONINFORMATION);
	// Show the amount of extended memory available.

	return statex;

Can anyone tell me what the difference is between %I64x, %I64d and why they work, but %lu/%ld/%d do not? Thank you in advance

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using, you agree to our community Guidelines, Terms of Use, and Privacy Policy. is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!