プロセススナップショットの取得


プロセススナップショットは主にPROSCESSENTRY 32という構造体に存在し、以下はこの構造体の情報である.
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; // 
DWORD cntUsage; //0
DWORD th32ProcessID; // ID:PID
ULONG_PTR th32DefaultHeapID; //0
DWORD th32ModuleID; //0
DWORD cntThreads; // 
DWORD th32ParentProcessID; // ID
LONG pcPriClassBase; // 
DWORD dwFlags; //0
TCHAR szExeFile[MAX_PATH]; // 
} PROCESSENTRY32, *PPROCESSENTRY32;

HANDLE WINAPI CreateToolhelp 32 Snapshot(DWORDdwFlags,//「スナップショット」で返す対象を指定するために使用され、TH 32 CS_SNAPPROCESSなどのDWORD th 32 ProcessID//プロセスIDであり、0であれば、すべてのプロセス、すなわちプロセススナップショットテーブルを表す).プロセスのスナップショットハンドルを取得します
BOOL WINAPI Process 32 First(HANDLE hSnapshot,//プロセススナップショットハンドルLPPROSCESSENTRY 32//PROCESCESSENTRY 32構造体ポインタ);最初のプロセススナップショットを取得するには、次のプロセスを取得するためにProcess 32 Nextを使用します.使用パラメータは、上のProcess 32 Firstと同じです.次は小さなコードです.
#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>

DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle);

int main()
{
	// 
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);

	HANDLE hProcessShot;
	hProcessShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	// , 0
	if (hProcessShot == INVALID_HANDLE_VALUE)
	{
		GetLastErrorBox(NULL," ");
		return 0;
	}
	//  
	if (Process32First(hProcessShot,&pe32))// 
	{
		for (int i = 0;Process32Next(hProcessShot, &pe32);i++)
		{
			printf("%d : %-20s ",i, pe32.szExeFile);
			TCHAR szStrTemp[50];
			wsprintf(szStrTemp,"PID : %d", pe32.th32ProcessID);
			printf("%-20s ", szStrTemp);
			wsprintf(szStrTemp,"cntThreads : %d",pe32.cntThreads);
			printf("%-20s 
",szStrTemp); } } // CloseHandle(hProcessShot); return 0; } // DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) { LPVOID lpv; DWORD dwRv; if (GetLastError() == 0) return 0; dwRv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&lpv, 0, NULL); MessageBox(hWnd, (LPCSTR)lpv, lpTitle, MB_OK); if(dwRv) LocalFree(lpv); SetLastError(0); return dwRv; }