进程控制流程

一 进程启动:

多种方式ShellExecuteWinExec,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 判断进程列表里有无监视进程,若没有,则重新启动进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值