Ошибка #8

Некорректное завершение работы процесса webclient.exe

Added by Семён Ощепков 251 days ago.

Status:Новый Start:11/22/2009
Priority:Немедленный Due date:
Assigned to:- % Done:

0%

Category:Исправления Spent time: -
Target version:1.0

Description

При обработке команды на обновление файла config.xml (cmdReceiveFile): процессом conn.exe, выполняется следующий код:

case cnCmdReceiveFile:
                        Log->Write("File received, restarting WebClient...");
                        CheckTimeTimer->Enabled=false;
                        CheckThreadsTimer->Enabled=false;
                        if ((FileExists("\\WebUpdate\\updater.exe"))&&((FileExists("\\WebUpdate\\update.exe"))||(DirectoryExists("\\WebUpdate\\update"))))
                        {
                            if (StartUpdate())
                            {
                                TerminateWebClient();
                                Close();
                                return;
                            }
                        }
                        else
                        {
                            RestartWebClient();
                        }
                        break;
Здесь происходит вызов метода TerminateWebClient:
void TForm1::TerminateWebClient()
{
try
    {
    Log->Write("Terminating WebClient...");
    HANDLE WCHandle=FileMap->ReadWCHandle();
    TerminateProgram(WCHandle);
    Sleep(500);
    if (IsProcessRunning(WCHandle))
        if(Cfg->Terminal.RebootAllowed) {
            Log->Write("Can't terminate WebClient. Reboot allowed - trying to reboot...");
            Reboot();
        } else
            Log->Append("Can't terminate WebClient. Reboot not allowed.");
    }
    catch(...)
    {
        ExceptionFilter(__FILE__, BOOST_CURRENT_FUNCTION, __LINE__, Log);
    }
}

bool TForm1::TerminateProgram(HANDLE PrHandle)
{
try
    {
    Log->Write("Terminating program...");
    if (!TerminateProcess(PrHandle, NO_ERROR))
        Log->Append(ShowError("error").c_str());
        else {
            Log->Append("OK.");
            return true;
        }
    return false;
    }
    catch(...)
    {
        ExceptionFilter(__FILE__, BOOST_CURRENT_FUNCTION, __LINE__, Log);
        return false;
    }
}

Очевидно, что здесь происходит принудительное завершение работы процесса webclient.exe через WinAPI функцию TerminateProcess. Поскольку conn.exe не проверяет текущее состояние webclient, что может привести к потере платежей от пользователей.

Кроме того, во время завершения работы возникает ошибка EAccessViolation.
Фрагмент log-файла Conn2:
13.11.2009 19:26:48.252 Restarting WebClient...
13.11.2009 19:26:48.252 Terminating WebClient...
13.11.2009 19:26:48.252 Terminating program...OK.
13.11.2009 19:26:48.752 Can't terminate WebClient. Reboot allowed - trying to reboot...
13.11.2009 19:26:48.752 Starting C:\WebClient\WebClient.exe...OK.
13.11.2009 19:26:49.299 Terminating conn...
13.11.2009 19:26:49.392 FormClose started.
13.11.2009 19:26:49.392 Waiting for threads to finish...
13.11.2009 19:26:50.345 Commands thread...done.
13.11.2009 19:26:50.345 SendHeartBeat thread...done.
13.11.2009 19:26:50.439 Payments thread...done.
13.11.2009 19:26:50.486 Stat thread...done.
13.11.2009 19:26:50.486 FileMap...done.
13.11.2009 19:26:50.486 Mutex...done.
13.11.2009 19:26:51.408 CryptLib.Close()
13.11.2009 19:26:51.408 Cfg...done.
13.11.2009 19:26:52.377 Log...
Фрагмент log-файла exception:
Version = 1.0.9.11
13.11.2009 19:26:53.064  
13.11.2009 19:26:53.064 borland Exception in file: ConnMainForm.cpp ,from function: TForm1::CheckThreads, catch line: 691, message: EAccessViolation
13.11.2009 19:26:53.064 

Also available in: Atom PDF