kkuzil.own@gmail.com

Posted
Filed under Development/C++
출처 : http://likehood.tistory.com/69

오랜만에 '개발' 카테고리에 글을..ㅋ

엄밀히 말하자면 프로세스의 워킹셋 사이즈를 가져오는 루틴이라고 봐야죠.

NT 4.0에서는 GetProcessMemoryInfo()을 호출할 때
"The program issued a command but the command lenght is incorrect" 라는 메세지 박스를 띄우는군요. Windows 업데이트문제인듯 한데..혹시 아시는 분 지혜를 부탁드릴께요~



#pragma comment(lib,"Psapi.lib")
#include "psapi.h"

DWORD GetUsingMemorySize(CString strProcessName)
{
 DWORD pid[1024];
 DWORD cb;
 EnumProcesses(pid,sizeof(DWORD)*1024,&cb);
 HMODULE hMo;
 CString strAll;
 for(int i = 0 ; i < 1024 ; ++i)
 {
  char szFileName[1024];
  HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,pid[i]);
  if(!hProcess)
   continue;
  BOOL bb=EnumProcessModules(hProcess,&hMo,sizeof(hMo),&cb);
  if(!bb)
  {
   DWORD error=GetLastError();
   LPVOID lpMsgBuf;
   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
      |FORMAT_MESSAGE_FROM_SYSTEM
      |FORMAT_MESSAGE_IGNORE_INSERTS
      , NULL,error,0,(LPSTR)&lpMsgBuf,0,NULL);
   CString strLastErrMsg=static_cast<LPCSTR>(lpMsgBuf);
   LocalFree(lpMsgBuf);
   CloseHandle(hProcess);
   continue;
  }
  GetModuleFileNameEx(hProcess,hMo,szFileName,1024);
  CString strProcName(szFileName);
  if(strProcName.Find(strProcessName) != -1 )
  {
   PROCESS_MEMORY_COUNTERS mem;
   GetProcessMemoryInfo(hProcess,&mem,sizeof(PROCESS_MEMORY_COUNTERS));
   CloseHandle(hProcess);
   return mem.WorkingSetSize;
  }
  CloseHandle(hProcess);
 }
 return NULL;
}
2009/05/08 10:53 2009/05/08 10:53