![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как подождать завершения приложения [D6, D7, Win95/98]
lhs7fy © (2004-01-16 12:47:00)Помогите разобраться!
Допустим моя программа запускает с помощью функции
ShellExecuteкакое-нибудь приложение, как сделать так,
чтобы моя програ ещё и подождала завершения выполнения
этого приложения?
Edward (2004-01-16 15:41:00) [1]
//----------------------------------------------------------------------------
//Запуск внешних программ
// APath: командная строка
// Mode: режим запуска: SW_SHOWNORMAL,
// SW_SHOWMINIMIZED,
// SW_SHOWMAXIMIZED,
// SW_HIDE
// Wait: 0 - не ждать завершения процесса (по умолчанию),
// 1 - ждать завершения процесса,
// Возвращаемое значение: при Wait = 0, возвращает:
// -1 - ошибка запуска,
// 0 - процесс запущен
// при Wait = 1, возвращает:
// -1 - ошибка запуска,
// Код завершения (определяется программой,
// которая запускается)
//----------------------------------------------------------------------------
function TMainForm.iWinExecute(APath: String; Mode, Wait: Integer): Integer;
var lpProcessInformation: TProcessInformation;
P: array[0..254] of Char;
lpStartupInfo: TStartupInfo;
R: LPDWORD;
begin
Result := -1;
FillChar(lpStartupInfo, SizeOf(TStartupInfo), $00);
with lpStartupInfo do
begin
lpDesktop := nil;
lpTitle := nil;
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := Mode;
end;
FillChar(P, SizeOf(P), $00);
StrPCopy(P, APath);
if CreateProcess(nil, P, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
nil, lpStartupInfo, lpProcessInformation) then
begin
if Wait = 1 then
begin
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
Result:= lpProcessInformation.hProcess;
New(R);
if GetExitCodeProcess(lpProcessInformation.hProcess, R^) then Result:= R^;
CloseHandle(lpProcessInformation.hProcess);
end
else
Result:= 0;
end;
end;
Rext (2004-01-16 15:17:00) [2]Попробуй так:
.
.
var si : StartUpInfo;
pi : Process_Information;
PathStr : string;
.
.
.
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
if not CreateProcess(nil,PChar(PathStr),nil,nil,false,0,nil,nil,si,pi) then
begin
MessageDlg('Ошибка запуска файла'+PathStr,mtError,[mbOk],0);
exit;
end;
WaitForSingleObject(pi.hProcess,Infinite);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
.
.
.
У меня в проге это работает.
Удачи.
Digitman (2004-01-16 13:34:00) [3]
> lhs7fy
вместо ShellExecute используй ShellExecuteEx
последняя в составе структуры SHELLEXECUTEINFO возвратит тебе хэндл созданного процесса. который ты можешь использовать в кач-ве хендла объекта синхронизации любой из WairFor-семейства функций, ожидающих наступление событий
следует лишь принять во внимание комментарий к полю hProcess в составе структуры SHELLEXECUTEINFO :
hProcess
Handle to the newly started application. This member is set on return and is always NULL if fMask is not set to SEE_MASK_NOCLOSEPROCESS
Serge (2004-01-16 13:11:00) [4]Поищи инфу насчет
CreateProcess