○プロセスやメモリ使用量の取得
Windows NT,2000用です。Win98では動作しません。
アクセス権の無いプロセスを取得できません(systemなど。)

Psapi.h
Psapi.Lib
Psapi.dll

をMSDNなどで探してきます。
VS.netでは最初から入ってるみたいです。

実行ファイルができる場所にPsapi.dllを置きます。配布するときも一緒に配布。

プロジェクトに Psapi.Lib、Psapi.h を参加させます。

#include "Psapi.h"
#include <stdio.h>

-----------------------PIDを列挙します------------------------

//PIDを列挙します。
void pid(){
	const int length = 1000;
	DWORD pid[length];
	DWORD len;

	EnumProcesses (pid,length,&len);
	len=len/sizeof(DWORD);

	for(DWORD i=0;i<len;i++){
		char buff[100]="";
		sprintf(buff,"%d\n",pid[i]);
		OutputDebugString(buff);//デバッグ出力
	}
}


-----------------------PIDからプロセス名を求める--------------------

//PIDからプロセス名を求める
//アクセス権の無いプロセスを取得できません
//---------------使用方法----------------
//char buff[100]="";
//getProsessName(buff,sizeof(buff),1256);
//OutputDebugString(buff);
void getProsessName(char *name,int nameSize,DWORD pid){
	HMODULE hMod[1000];
	DWORD size=0;
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);
	if(hProcess!=NULL){
		EnumProcessModules(hProcess, hMod, sizeof(hMod), &size);
		DWORD ModNum = size / sizeof(HMODULE);
		GetModuleBaseName(hProcess,hMod[0],name,nameSize);
		CloseHandle(hProcess);
	}else{
		name[0]='\0';
	}

////プロセスに含まれるすべてのモジュールを出力することも可能
//	for(DWORD i=0; i<ModNum; i++) {
//		char BaseName[1000]="";
//		GetModuleBaseName(hProcess,hMod[i], BaseName, 1000);
//		OutputDebugString(BaseName);
//		OutputDebugString("\n");
//	}

}


------------------------PIDから使用しているメモリを求める---------------------


//PIDから使用しているメモリを求める
//アクセス権の無いプロセスを取得できません
//---------------使用方法----------------
//	PROCESS_MEMORY_COUNTERS MemInfo = getMemory(1256);
//	char buff[100];
//	sprintf(buff,"メモリ使用量%d\n", MemInfo.WorkingSetSize/1024);
//	OutputDebugString(buff);
//	sprintf(buff,"仮想メモリサイズ%d\n", MemInfo.PagefileUsage/1024);
//	OutputDebugString(buff);
PROCESS_MEMORY_COUNTERS getMemory(DWORD pid){
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);
	PROCESS_MEMORY_COUNTERS MemInfo;
	MemInfo.WorkingSetSize=0;
	MemInfo.PagefileUsage=0;
	GetProcessMemoryInfo(hProcess, &MemInfo, sizeof(MemInfo));
	CloseHandle(hProcess);
	return MemInfo;
}

--------------------------応用編---------------------------
#include <string.h>
//プロセス名のPIDを返します。見つからなかった場合は0を返します。
DWORD getPID(char*pName){
	const int length = 1000;
	DWORD pid[length];
	DWORD len;
	EnumProcesses (pid,length,&len);
	len=len/sizeof(DWORD);
	for(DWORD i=0;i<len;i++){
		char buff[100]="";
		getProsessName(buff,sizeof(buff),pid[i]);
		if(strcmp(buff,pName)==0) return pid[i]; 
	}
	return 0;
}



▲トップページ > Windows と C++