Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа не завершающаяся по ctrl+alt+del???

5.7K
12 октября 2006 года
denxx
45 / / 05.01.2006
Доброе время суток.
Подскажите пожалуйста код, который перед тем, как винда завершит процесс, должен запустить свою копию и передать ей все нужные данные перед благополучным завершением. Т.е. код, который будет запускать копию новой программы перед ее завершением.
294
12 октября 2006 года
Plisteron
982 / / 29.08.2003
Соотв. образом реализовать OnClose() или OnCloseQuery() главного окна, в теле использовать CreateProcess для запуска новой копии. Передавать нужные данные можно -- как один из вариантов -- через файл или, например, через IP-соединение.
5.7K
13 октября 2006 года
denxx
45 / / 05.01.2006
Можно поподробней о CreateProcess, какой нибудь простой пример?
294
16 октября 2006 года
Plisteron
982 / / 29.08.2003
Кусочек моей проги
Код:
int __fastcall TfrmMain::Exec(TObject *Sender,
                                     AnsiString CmdLine, AnsiString WorkDir,
                                     unsigned short ShowMode)
{
    int                  Result = -1;
    DWORD                ExitCode;
    STARTUPINFO          si;
    PROCESS_INFORMATION  pi;
    BOOL                 isProcessRunning;

    ZeroMemory((PVOID)&si, (DWORD)sizeof(si));
    ZeroMemory((PVOID)&pi, (DWORD)sizeof(pi));
    si.cb               = sizeof(si);
    si.wShowWindow      = ShowMode /* SW_SHOWNORMAL */;
    Log.Write(AnsiString("Выполнение внешней программы: ") + CmdLine);
    if(CreateProcess(NULL,
                     CmdLine.c_str(),
                     NULL,
                     NULL,
                     FALSE,
                     CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
                     NULL,
                     WorkDir.c_str(),
                     &si,
                     &pi) == TRUE)
    {
        CloseHandle(pi.hThread);
        WaitForInputIdle(pi.hProcess, INFINITE);
        WaitForSingleObject(pi.hProcess, INFINITE);
        GetExitCodeProcess(pi.hProcess, &ExitCode);
        CloseHandle(pi.hProcess);
        Result = ExitCode;
        Log.Write(AnsiString("Выполнение внешней программы завершено,"
                                    " код возврата ") + AnsiString(ExitCode));
    }
    else
    {
        throw Exception("Не могу запустить внешний процесс!");
    } // <<< if(CreateProcess(...
    return Result;
}

...
Код:
AnsiString space(" ");
        AnsiString quote("\"");
        AnsiString minusw("-w");

        AnsiString RarCmd("RAR e -y ");

        CheckDelAll(ExtractDir);
       
        RarCmd += minusw + quote + TempDir    + quote + space;
        RarCmd +=          quote + SourceArch + quote + space;
        RarCmd +=          quote + ExtractDir + quote;

        Log.Write(AnsiString("Распаковываем ") + SourceArch);

        ret = Exec(Sender, RarCmd,
                              ExtractFilePath(Application->ExeName), SW_HIDE);
294
16 октября 2006 года
Plisteron
982 / / 29.08.2003
Да, чуть не забыл. Поиск по форуму рулит.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог