Форум: "Система";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизКак подождать завершения приложения Найти похожие ветки
← →
lhs7fy (2004-01-16 12:47) [0]Помогите разобраться!
Допустим моя программа запускает с помощью функции
ShellExecute какое-нибудь приложение, как сделать так,
чтобы моя програ ещё и подождала завершения выполнения
этого приложения?
← →
Serge © (2004-01-16 13:11) [1]Поищи инфу насчет
CreateProcess
← →
Digitman © (2004-01-16 13:34) [2]
> 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
← →
Rext (2004-01-16 15:17) [3]Попробуй так:
.
.
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);
.
.
.
У меня в проге это работает.
Удачи.
← →
Edward (2004-01-16 15:41) [4]
//----------------------------------------------------------------------------
//Запуск внешних программ
// 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;
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c