双进程守护技术的实现,最好是vc,c++.
写了一个主要函数,你可以在这两个线程的入口函数分别创建一个新线程或者使用定时器。然后使用Daemon()这个函数。Daemon这个函数用来监视同一个文件夹中的2个进程,如果要使用不同文件夹中的两个进程,把注释部分去掉就行了。
#include
<iostream>
#include
<afxwin.h>
#include
<TlHelp32.h>
int
Daemon(CString
AppName)
{
//如果需要守护的进程名为空
if(AppName.IsEmpty())
{
return
1;
}
CString
strName
=
AppName;
//如果使用绝对路径,请去掉下面的注释
//int
npos
=
strName.ReverseFind('\\');
//if(npos
<=
0)
//{
//
return
1;
//}
//strName
=
AppName.Right(AppName.GetLength()
-
npos
-
1);
//定义ProcessEntry32结构
PROCESSENTRY32
pe32;
pe32.dwSize
=
sizeof(pe32);
//
给系统内的所有进程拍一个快照
HANDLE
hProcessSnap
=
::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
0);
if(hProcessSnap
==
INVALID_HANDLE_VALUE)
{
printf("
无法得到进程快照
\n");
return
-1;
}
//需要启动进程的标志位,当进程关闭时,该标志位为TRUE
BOOL
bNeedStart
=
TRUE;
//
遍历进程快照,轮流显示每个进程的信息
BOOL
bMore
=
::Process32First(hProcessSnap,
&pe32);
while(bMore)
{
//如果该进程名在快照中存在
if(strcmp(pe32.szExeFile,
strName)
==
0)
{
//启动标志位置FALSE
bNeedStart
=
FALSE;
}
bMore
=
::Process32Next(hProcessSnap,
&pe32);
}
::CloseHandle(hProcessSnap);
//如果标志位为True,即该进程没有在快照中
if(bNeedStart)
{
::Sleep(1000);
STARTUPINFO
si
=
{
sizeof(si)
};
PROCESS_INFORMATION
pi;
si.dwFlags
=
STARTF_USESHOWWINDOW;
si.wShowWindow
=
TRUE;
//启动该进程
BOOL
bRet
=
::CreateProcess
(NULL,
AppName.GetBuffer(AppName.GetLength()),
NULL,NULL,FALSE,
CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
if(bRet)
{
::CloseHandle
(pi.hThread);
::CloseHandle
(pi.hProcess);
}
}
return
0;
}
strName
=
str.Right(str.GetLength()
-
nn
-
1);
//定义ProcessEntry32结构
PROCESSENTRY32
pe32;
pe32.dwSize
=
sizeof(pe32);
//
给系统内的所有进程拍一个快照
HANDLE
hProcessSnap
=
::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
0);
if(hProcessSnap
==
INVALID_HANDLE_VALUE)
{
printf("
无法得到进程快照
\n");
return
-1;
}
//需要启动进程的标志位,当进程关闭时,该标志位为TRUE
BOOL
bNeedStart
=
TRUE;
//
遍历进程快照,轮流显示每个进程的信息
BOOL
bMore
=
::Process32First(hProcessSnap,
&pe32);
while(bMore)
{
//如果该进程名在快照中存在
if(strcmp(pe32.szExeFile,
strName)
==
0)
{
//启动标志位置FALSE
bNeedStart
=
FALSE;
}
bMore
=
::Process32Next(hProcessSnap,
&pe32);
}
::CloseHandle(hProcessSnap);
//如果标志位为True,即该进程没有在快照中
if(bNeedStart)
{
::Sleep(1000);
STARTUPINFO
si
=
{
sizeof(si)
};
PROCESS_INFORMATION
pi;
si.dwFlags
=
STARTF_USESHOWWINDOW;
si.wShowWindow
=
TRUE;
//启动该进程
BOOL
bRet
=
::CreateProcess
(NULL,
AppName.GetBuffer(AppName.GetLength()),
NULL,NULL,FALSE,
CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
if(bRet)
{
::CloseHandle
(pi.hThread);
::CloseHandle
(pi.hProcess);
}
}
return
0;
}