![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка внешних программ [D5, WinXP]
Sasha000 © (2005-09-30 20:38:00)Ниже приведён код который запускает внешнюю прогу и ждёт её завершения. Всё в принципе работает. Только вот не совсеми программами. Мне надо запустить программу установки Setup.exe. При выполнении кода программа установки не появляется, а всё зависает. Короче они друг друга ждут пока кто нибуть закроется. Программа ждёт пока завершится непоявившаяся программа setup завершится, а программа установки не появляется. Но как только я нажимаю снять задачу с программы (насильно закрываю написанное мною прогу), как тут же запускается программа установи. Только теперь мне уже не надо. Мне надо чтобы её не вырубать. Она должна сделать кое какие действия после того, как пройдёт установка.А она виснет. И из-за этого не появляется setup.
Ведать когда прога ждёт завершения другой она зависает. А некоторые внешние приложения не работают когда кто-то висит в системе.
Помогите пожалуйста разобраться. Как сделать так, чтобы прога ждущая окончания работы внешней программы не висела.
Если мне не верите проверте сами этот алгоритм. Запустите программу установки чего либа.
function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: ShortString;
begin
{ Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
CmdLine := '"' + Filename + '" ' + Params;
FillChar(StartInfo, SizeOf(StartInfo), #0);
with StartInfo do
begin
cb := SizeOf(StartInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WinState;
end;
Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
{ Ожидаем завершения приложения }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Free the Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
......
ExecAndWait(С:\setup.EXE','', SW_SHOWNORMAL );
Sasha000 (2005-10-01 09:47:00) [1]
> ssk © (01.10.05 09:33) [5]
Спасибо тебе большое пребольшое!!!!!!!
Всё работает. Инсталляция запустилась.
Спасибо!!!!
ssk (2005-10-01 09:33:00) [2]> Sasha000 (30.09.05 20:38)
замени у себя в коде строкуWaitForSingleObject(ProcInfo.hProcess, INFINITE);
на
while WaitForSingleObject(ProcInfo.hProcess, 50) = WAIT_TIMEOUT do
Application.ProcessMessages;
Sasha000 (2005-10-01 09:26:00) [3]Мне бы хотябы чтобы программа не висело приожидании, а перерисовывалась её главная форма.
Sasha000 (2005-10-01 09:06:00) [4]
> begin...end © (30.09.05 21:22) [2]
А как напиши пожалуйста пример. Если можно.
begin...end (2005-09-30 21:22:00) [5]> Sasha000 (30.09.05 20:38)
> Как сделать так, чтобы прога ждущая окончания работы внешней
> программы не висела.
Вынести код ожидания завершения работы внешней программы в дополнительный поток.
umbra (2005-09-30 21:10:00) [6]
> CREATE_NEW_CONSOLE
А setup.EXE консольная прога?