应用程序崩溃时无法完全杀死进程?

时间:2013-12-25 10:54:56

标签: c++

我将在下面描述我的问题

我有两个应用mainAppsupervisorApp

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,因此无法启动。

然后我将mainAppIsThisProcessHasRun() false的Dialog's Crashed消息与countProcess=1关闭,以便它可以成功启动!

我不明白为什么?我想如果我能自动对话mainApp的Dialog's Crashed消息,那么我的问题就可以解决了。 但也许这不是好的解决方案!

有人可以告诉我如何彻底杀死进程mainApp.exe吗?

非常感谢!

T& T公司

0 个答案:

没有答案