一 进程启动:
多种方式ShellExecute
,
WinExec,CreateProcess。WinExec参数只有两个,是最简单的启动,CreateProcess参数有10个,多数可以为null,ShellExecute
居中,可以用ShellExecute启动进程。
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
返回值大于32表示启动成功,小于或等于32表示启动错误,相应值反映了相应错误信息。
二 进程控制相关函数
头文件 "psapi.h",库"psapi.lib",注意需要自己下载放在工程里。
相关函数如下:
1 枚举所有进程,EnumProcesses
BOOL EnumProcesses(
DWORD *lpidProcess, // array of process identifiers
DWORD cb, // size of array
DWORD *cbNeeded // number of bytes returned
);
此处获得所有进程的id,然后用下面的函数由id获得句柄。
2 获得进程句柄,OpenProcess
HANDLE OpenProcess(
DWORD fdwAccess, //打开参数
BOOL fInherit,
DWORD IDProcess);
获得进程句柄,后面的很多操作函数,都要用句柄。
第一个参数是按位或:若可以用TerminateProcess关闭进程,第一项参数里应该包括
PROCESS_TERMINATE
3 获得进程Module,EnumProcessModules
BOOLEnumProcessModules(
HANDLE hProcess, // handle to process
HMODULE *lphModule, // array of module handles
DWORD cb, // size of array
LPDWORD lpcbNeeded // number of bytes required
);
4 获得进程名字,GetModuleBaseName
DWORDGetModuleBaseName(
HANDLE hProcess, // handle to process
HMODULE hModule, // handle to module
LPTSTR lpBaseName, // base name buffer
DWORD nSize // maximum characters to retrieve
);
5 获取内存使用情况,GetProcessMemoryInfo。
BOOLGetProcessMemoryInfo(
HANDLE Process, // handle to process
PPROCESS_MEMORY_COUNTERS ppsmemCounters, // buffer
DWORD cb // size of buffer
);
结构如下:
typedef struct _PROCESS_MEMORY_COUNTERS {
DWORD cb; //结构大小
DWORD PageFaultCount;//缺页中断次数
SIZE_T PeakWorkingSetSize;//使用内存高峰
SIZE_T WorkingSetSize;//当前使用内存
SIZE_T QuotaPeakPagedPoolUsage;// 使用页面缓存池高峰
SIZE_T QuotaPagedPoolUsage;// 使用页面缓存池
SIZE_T QuotaPeakNonPagedPoolUsage;//使用非分页缓存池高峰
SIZE_T QuotaNonPagedPoolUsage;// 使用非分页缓存池
SIZE_T PagefileUsage;//使用分页文件
SIZE_T PeakPagefileUsage;//使用分页文件高峰
} PROCESS_MEMORY_COUNTERS;
6 获取io情况
BOOLGetProcessIoCounters(
HANDLE hProcess, // handle to process
PIO_COUNTERSlpIoCounters // I/O accouting information
);
结构如下:
typedef struct _IO_COUNTERS {
ULONGLONG ReadOperationCount;// IO读取
ULONGLONG WriteOperationCount;// IO写入
ULONGLONG OtherOperationCount;// IO其他
ULONGLONG ReadTransferCount;// IO读取字节
ULONGLONG WriteTransferCount;// IO写入字节
ULONGLONG OtherTransferCount;// IO其他字节
} IO_COUNTERS;
typedef IO_COUNTERS*PIO_COUNTERS;
注意:若是你的开发环境不认GetProcessIoCounters,IO_COUNTERS,则是因为sdk比较老版本导致,解决方法:
如果机器上装了visual 2005,则很好办。vc6.0开发环境下打开项目,点击tools菜单,打开options对话框,选择directories标签,选择include files下拉菜单,然后new一个directory,设置为C:\PROGRAM FILES\MICROSOFTVISUAL STUDIO 8\VC\PLATFORMSDK\INCLUDE。然后把这个目录放在第一项。如下图:
修改了include files下拉菜单后,接着选择Library files,new一个directory,设置其值为C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 8\VC\PLATFORMSDK\LIB,并调整未知至最顶端。如下图:
7 关闭进程句柄
BOOL CloseHandle(
HANDLE hObject);
养成良好习惯,打开句柄,用完关掉。
三 关闭进程(windows.h)
BOOL TerminateProcess(
HANDLE hProcess,
DWORD uExitCode);
四 进程监控实现:
1 枚举进程,得到进程名,与待检测进程比较。
2 配置文件选择监视项:每次启动程序时会先读取配置文件,以确定需要监视几项。
3 每500毫秒更新一次监视值,连续记录10次,若监视各项两两之间没有丝毫变化,则确信进程已死掉,则杀死进程。
4 判断进程列表里有无监视进程,若没有,则重新启动进程。