对于无人维护的程序,利用监控程序可以保证进程运行。
// 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