进程监控的小程序

监控某一子进程是否结束有两种方法:一种是定时调用GetExitCodeProcess取进程的退出代码。如果进程没有退出,退出代码为STILL_ACTIVE;进程退出,则退出代码为实际的退出值,判断退出代码就可以知道进程是否结束了。另一种是调用WaitForSingleObject,挂起父进程,等待指定子进程结束。下面的示例是调用CreateProcess打开计事本,然后定时监控该进程,如果它意外退出,马上重新启动该进程。
对于无人维护的程序,利用监控程序可以保证进程运行。

// ProcessMonitor.cpp : 定义应用程序的入口点。
//进程监控程序。改自Delphi深入Windows核心编程96页
//作者huangfei
//2005年8月25日


#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
// Windows 头文件:
#include <windows.h>
#include <windowsx.h>
//#include <CmnHdr.h>
// C 运行时头文件
#include <stdio.h>
#include <tchar.h>

// TODO: 在此处引用程序要求的附加头文件
#include "ProcessMonitor.h"

// 此代码模块中包含的函数的前向声明:
BOOL CALLBACK Dlg_DlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);


STARTUPINFO sStartInfo = {sizeof(sStartInfo)};
PROCESS_INFORMATION PProcInfo ;
SECURITY_ATTRIBUTES seProcess,seThread;


//该函数取自核心编程第四章
//向编辑控件添加文本
void AddText(HWND hwnd, PCTSTR pszFormat, ...) {

   va_list argList;
   va_start(argList, pszFormat);

   TCHAR sz[20 * 1024];
   Edit_GetText(hwnd, sz, sizeof(sz)/sizeof(TCHAR));
   _vstprintf(_tcschr(sz, 0), pszFormat, argList);
  //_vstprintf(sz, pszFormat, argList);
   Edit_SetText(hwnd, sz);
//  SendMessage(hwnd, EM_REPLACESEL,0, (LPARAM)sz);  
  //SendMessage(hwnd, WM_VSCROLL,SB_BOTTOM, 0);
   va_end(argList);
}

void AllRunProcess(HWND hDlg)
{
BOOL bSucess;

// DWORD dwExitCode;
/*
STARTUPINFO sStartInfo = {sizeof(sStartInfo)};
static PROCESS_INFORMATION PProcInfo ;

    SECURITY_ATTRIBUTES seProcess,seThread;*/
seProcess.nLength = sizeof(seProcess);
    seProcess.lpSecurityDescriptor = NULL;
    seProcess.bInheritHandle = TRUE;

    seThread.nLength = sizeof(seThread);
    seThread.lpSecurityDescriptor = NULL;
    seThread.bInheritHandle = TRUE;

TCHAR sz[20 * 1024];
Edit_GetText(GetDlgItem(hDlg,IDC_EDIT2), sz, sizeof(sz)/sizeof(TCHAR));
bSucess = CreateProcess(NULL,sz,&seProcess,&seThread,FALSE,CREATE_DEFAULT_ERROR_MODE,
NULL,NULL,&sStartInfo,&PProcInfo);
if(bSucess == FALSE)
AddText(GetDlgItem(hDlg,IDC_EDIT1),"创建记事本失败/r/n");
else
{
AddText(GetDlgItem(hDlg,IDC_EDIT1),"创建记事本成功/r/n");
}

CloseHandle(PProcInfo.hThread);

//以下是方案2,但主程序被挂起,无法关掉,所以设置了5次之后不再监控
/*
static i=0;

if(i<5){

WaitForSingleObject(PProcInfo.hProcess,INFINITE);

BOOL fProcessExit = GetExitCodeProcess(PProcInfo.hProcess,&dwExitCode);
if(fProcessExit && (dwExitCode != STILL_ACTIVE))
{
AddText(GetDlgItem(hDlg,IDC_EDIT1),"NotePad进程终止/r/n");
CloseHandle(PProcInfo.hProcess);
//CloseHandle(PProcInfo.hThread);
AllRunProcess(hDlg);
}
}*/
// CloseHandle(PProcInfo.hProcess);
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Dlg_DlgProc);
return 0;
}



// 主对话框的消息处理程序。
BOOL CALLBACK Dlg_DlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    BOOL fProcessExit;
switch (uMsg)
{
case WM_INITDIALOG:
Edit_SetText(GetDlgItem(hwndDlg,IDC_EDIT2), TEXT("c://windows//notepad.exe"));
//设置定时器
SetTimer(hwndDlg,1,1000,NULL);
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
KillTimer(hwndDlg,1);
EndDialog(hwndDlg, LOWORD(wParam));
// if(PProcInfo.hProcess!=0)
// CloseHandle(PProcInfo.hProcess);
return TRUE;
}

if (LOWORD(wParam) == IDOK)
{
AllRunProcess(hwndDlg);
return TRUE;
}

case WM_CTLCOLORSTATIC://改变只读EDIT1只读控件的背景为白色
        return (BOOL)GetStockObject(WHITE_BRUSH);

case WM_TIMER:
DWORD dwExitCode;

    fProcessExit = GetExitCodeProcess(PProcInfo.hProcess,&dwExitCode);
    if(fProcessExit && (dwExitCode != STILL_ACTIVE))
{
AddText(GetDlgItem(hwndDlg,IDC_EDIT1),"NotePad进程终止/r/n");
CloseHandle(PProcInfo.hProcess);
//CloseHandle(PProcInfo.hThread);
AllRunProcess(hwndDlg);
}
return TRUE;
}
return FALSE;
}

///

ProcessMonitor.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/
#undef APSTUDIO_READONLY_SYMBOLS

/
// 中文(中华人民共和国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_PROCESSMONITOR      ICON                    "ProcessMonitor.ico"
IDI_SMALL               ICON                    "small.ico"

/
//
// Accelerator
//

IDC_PROCESSMONITOR ACCELERATORS
BEGIN
    "?",            IDM_ABOUT,              ASCII,  ALT
    "/",            IDM_ABOUT,              ASCII,  ALT
END


#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h/0"
END

2 TEXTINCLUDE
BEGIN
    "#define APSTUDIO_HIDDEN_SYMBOLS/r/n"
    "#include ""windows.h""/r/n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS/r/n"
    "/0"
END

3 TEXTINCLUDE
BEGIN
    "/r/n"
    "/0"
END

#endif    // APSTUDIO_INVOKED


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 216
        TOPMARGIN, 7
        BOTTOMMARGIN, 202
    END
END
#endif    // APSTUDIO_INVOKED


/
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 224, 209
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP |
    WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,82,186,50,14
    EDITTEXT        IDC_EDIT1,11,11,200,149,ES_MULTILINE | ES_AUTOHSCROLL |
                    ES_READONLY | WS_VSCROLL
    LTEXT           "可执行文件名",IDC_STATIC,9,172,54,13
    EDITTEXT        IDC_EDIT2,60,169,150,14,ES_AUTOHSCROLL
END


/
//
// String Table
//

STRINGTABLE
BEGIN
    IDS_APP_TITLE           "ProcessMonitor"
    IDC_PROCESSMONITOR      "PROCESSMONITOR"
END

#endif    // 中文(中华人民共和国) resources
/

#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//


#endif    // not APSTUDIO_INVOKED

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值