我将在下面描述我的问题
我有两个应用mainApp
和supervisorApp
。
supervisorApp
将与mainApp
同时监督mainApp
。
supervisorApp
会通过向mainApp
发送KEEP_ALIVE
消息来检查每个30岁的mainApp
的状态。
如果supervisorApp
没有回复mainApp
消息,mainApp
将重新启动KEEP_ALIVE
。
更多一条规则,mainApp
不允许两个以上的进程"mainApp.exe"
一起运行,
这意味着,如果有其他进程mainApp
正在运行,则"mainApp.exe"
会在启动时立即关闭。
然后我会发布一些主要代码并显示我的问题。
//Code for supervisorApp - Begin
void Main()
{
while (true)
{
Sleep(30000);
if(SendKeepAliveMessage() == false) //MainApp is not responding -> Restart mainApp
{
TerminateMainApp();
Sleep(2000);
StartMainApp();
}
}
}
void TerminateMainApp()
{
TerminateProcess(MainAppProcessInfo.hProcess, 0);
CloseHandle( MainAppProcessInfo.hProcess );
CloseHandle( MainAppProcessInfo.hThread );
}
bool StartMainApp()
{
ZeroMemory( &MainAppStartUpInfo, sizeof(MainAppStartUpInfo) );
MainAppStartUpInfo.cb = sizeof(MainAppStartUpInfo);
ZeroMemory( &MainAppProcessInfo, sizeof(MainAppProcessInfo) );
char commandLine[STR_LENGTH_256];
sprintf(commandLine, "mainApp.exe");
LPSTR cmd = _T(commandLine);
//Start the child process
if( !CreateProcess
(NULL, // No module name (use command line)
cmd, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&MainAppStartUpInfo, // Pointer to STARTUPINFO structure
&MainAppProcessInfo // Pointer to PROCESS_INFORMATION structure
)
)
{
return false;
}
return true;
}
//Code for supervisorApp - End
//Code for mainApp - Begin
void Main()
{
if (IsThisProcessHasRun())
{
MessageBox.Show("The mainApp is running!");
return;
}
//Do something
}
bool IsThisProcessHasRun()
{
HANDLE SnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( SnapShot == INVALID_HANDLE_VALUE )
return false;
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First( SnapShot, &procEntry ) )
{
CloseHandle(SnapShot);
return false;
}
int countProcess = 0;
do
{
if( strcmp( procEntry.szExeFile, "mainApp.exe" ) == 0 )
{
countProcess++;
if(countProcess == 2)
{
CloseHandle(SnapShot);
return true;
}
}
}
while( Process32Next( SnapShot, &procEntry ) );
CloseHandle(SnapShot);
return false;
}
//Code for mainApp - End
在Windows 7上一切正常,但在Windows 8上我遇到了以下问题。
当mainApp.exe
崩溃时(窗口会显示带有"the mainApp has stopped working"
消息的对话框 - >不要关闭它),
supervisorMainApp
发送KEEP_ALIVE
消息,而mainApp
未回复此消息,
然后,supervisorMainApp
会调用TerminateMainApp()
和StartMainApp()
重新启动mainApp
。
但是当mainApp
开始时,它会显示对话框"The mainApp is running!"
...
我调试并看到,函数TerminateMainApp()
和StartMainApp()
工作正常。
调用TerminateMainApp()
时,在任务管理器的过程列表中将删除"mainApp.exe"
=>没关系
但是当mainApp
开始时,函数IsThisProcessHasRun()
会返回true countProcess=2
,因此无法启动。
然后我将mainApp
,IsThisProcessHasRun()
false的Dialog's Crashed消息与countProcess=1
关闭,以便它可以成功启动!
我不明白为什么?我想如果我能自动对话mainApp
的Dialog's Crashed消息,那么我的问题就可以解决了。
但也许这不是好的解决方案!
有人可以告诉我如何彻底杀死进程mainApp.exe
吗?
非常感谢!
T& T公司