一个监控进程的实现(高分) 我想在一个程序启动的时候,另外启动一个进程,来监视该程序,如果程序被关掉,就重新启动.我用的是命名管道实现的,就是调不过去,请各位高手帮我写一个,急! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include "tlhelp32.h"DWORD ProcesstoPid(char *pid) //查找指定进程的PID(Process ID){HANDLE hProcessSnap=NULL;char buffer[MAX_PATH];PROCESSENTRY32 pe32={0};int i;hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //打开进程快照if(hProcessSnap==(HANDLE)-1){printf("CreateToolhelp32Snapshot() Error: %d",GetLastError());return 0;}pe32.dwSize=sizeof(PROCESSENTRY32);if(Process32First(hProcessSnap,&pe32)) //开始枚举进程{do{strcpy(buffer,pe32.szExeFile);for(i=strlen(buffer);i>0;i--) //截取进程名if(buffer[i]=='\\')break;if(!stricmp(pid,&buffer[i])) //判断是否和提供的进程名相等,是,返回进程的IDreturn pe32.th32ProcessID;}while(Process32Next(hProcessSnap,&pe32)); //继续枚举进程}else{printf("Process32First() Error: %d",GetLastError());return 0;}CloseHandle(hProcessSnap); //关闭系统进程快照的句柄return 0;}int main(){while(1){Sleep(10000)if(ProcesstoPid(我的程序.exe)==0){ ShellExecute或者CreateProcess}}} 由监控的进程来启动需要运行的进程,然后用waitforsingleobject来等待createprocess返回的进程句柄,然后重起。 获得进程handle,然后判断是否关闭,关了,守护进程启动它 用你的监控进程来启动被监控的进程,如:while(1){ h=CreateProcess(被监控进程); WaitForSingle(h);}当进程被关闭时,WaitForSingle返回,重新启动进程。 要判断是否停止响应的话,如果进程有窗口界面就好办,可以用sendmessagetimeout发个窗口消息,超时的话就是停止响应了。 使用QueryServiceStatus查询服务状态 LPPROCESS_INFORMATION pi; HWND hwin; CreateProcess(被监控进程,...,pi); hwin=findwindow(被监控进程一个窗口名); DWORD dexitcode; do { // if(Sendmessagetimeout(hwin,WM_GETTEXT,...)==false) { getlasterror() //判断是否有反映 ... } GetExitCodeProcess(pi.hprocess,dexitcode); } While(dexitcode==STILL_ACTIVE)} 关键是两个进程要相互监视.使用while又太浪费资源了.可以使用socket,让两个进程建立起TCP连接,在OnClose事件中重新创建另一个进程 建议使win32 service,不过被监视的程序只能是控制台应用程序. 画刷会造成资源泄露??? 采用ADO用本机的IP地址连接本机的数据库,连接字符串该该怎么写? 问几个问题! 关于光照、纹理的问题 Activex小问题,搞了一个星期都没出来,郁闷死... 添加"确定"按钮怎么设置它,当回车时,确定按钮做出响应,也就是回车默认为确定键 API Hook 如何定义全局变量? 如何使用for语句许多位图而不会有闪烁感 有做过共享软件的作者请进 请教高手一个问题 用CDC画图
{
HANDLE hProcessSnap=NULL;
char buffer[MAX_PATH];
PROCESSENTRY32 pe32={0};
int i;
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //打开进程快照
if(hProcessSnap==(HANDLE)-1)
{
printf("CreateToolhelp32Snapshot() Error: %d",GetLastError());
return 0;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32)) //开始枚举进程
{
do
{
strcpy(buffer,pe32.szExeFile);
for(i=strlen(buffer);i>0;i--) //截取进程名
if(buffer[i]=='\\')
break;
if(!stricmp(pid,&buffer[i])) //判断是否和提供的进程名相等,是,返回进程的ID
return pe32.th32ProcessID;
}
while(Process32Next(hProcessSnap,&pe32)); //继续枚举进程
}
else
{
printf("Process32First() Error: %d",GetLastError());
return 0;
}
CloseHandle(hProcessSnap); //关闭系统进程快照的句柄
return 0;
}int main()
{
while(1)
{
Sleep(10000)
if(ProcesstoPid(我的程序.exe)==0)
{
ShellExecute或者CreateProcess
}
}
}
while(1)
{
h=CreateProcess(被监控进程);
WaitForSingle(h);
}
当进程被关闭时,WaitForSingle返回,重新启动进程。
HWND hwin;
CreateProcess(被监控进程,...,pi);
hwin=findwindow(被监控进程一个窗口名);
DWORD dexitcode;
do
{
//
if(Sendmessagetimeout(hwin,WM_GETTEXT,...)==false)
{
getlasterror()
//判断是否有反映
...
}
GetExitCodeProcess(pi.hprocess,dexitcode);
}
While(dexitcode==STILL_ACTIVE)
}
使用while又太浪费资源了.
可以使用socket,让两个进程建立起TCP连接,在OnClose事件中重新创建另一个进程