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;
}
Программа не завершающаяся по ctrl+alt+del???
Подскажите пожалуйста код, который перед тем, как винда завершит процесс, должен запустить свою копию и передать ей все нужные данные перед благополучным завершением. Т.е. код, который будет запускать копию новой программы перед ее завершением.
Соотв. образом реализовать OnClose() или OnCloseQuery() главного окна, в теле использовать CreateProcess для запуска новой копии. Передавать нужные данные можно -- как один из вариантов -- через файл или, например, через IP-соединение.
Можно поподробней о CreateProcess, какой нибудь простой пример?
Код:
...
Код:
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);
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);
Да, чуть не забыл. Поиск по форуму рулит.