![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите про использование CreateProcess... [D6, XP]
vegarulez © (2007-04-17 07:56:00)Хочу использовать вызов батника, и ещё одного *.ехе из своей проги. по таймеру. Но нужно знать завершил ли работу батник и экзешник, для этого хочу пользовать не WinExec (как сечас пользую), а CreateProcess, чтобы можно было опрашивать состояние, завершил ли уже работу батник и экзешник. Чтобы запускать их только в том случае если их уже нет. Но в CreateProcess столько параметров... прям запутался... Если можно дайте какой нить кусочек кода с вызовом, и опросом состояния - чтобы понять что к чему. И если есть ссыль на хорошее описание - тоже просьба поделиться.
Leonid Troyanovsky (2007-04-17 18:09:00) [21]
> Desdechado © (17.04.07 16:11) [10]
> Почти. Немного другой набор параметров для FormatMessage
> + дополнительные навороты.
Вот. А в приведенном тобой коде оного нет.
> По поводу инициализации я понял, почему у меня не было ошибок.
> hStartupInfo: TStartupInfo у меня обычно глобальная переменная.
Нужна и инициализация и, минимально, заполнение cb.
> А по поводу закрытия хэндлов. Их таки обязательно в вызывающей
Возьми за правило закрывать. Т.е., как только стали не нужны - сразу.
Например, хендл потока в рассмотренных примерах - сразу после
удачного CreateProcess.
Утечка хендлов, к сожалению, довольно распространненый грех.
--
Regards, LVT.
Игорь Шевченко (2007-04-17 17:58:00) [22]Desdechado © (17.04.07 16:11) [10]
Ну собственно поэтому пример и претендует на неполноту и некачественность
Desdechado (2007-04-17 16:11:00) [23]> SysErrorMessage?
Почти. Немного другой набор параметров для FormatMessage + дополнительные навороты.
По поводу инициализации я понял, почему у меня не было ошибок. hStartupInfo: TStartupInfo у меня обычно глобальная переменная.
А по поводу закрытия хэндлов. Их таки обязательно в вызывающей программе закрывать? А то я так и не понял из справки...
Leonid Troyanovsky (2007-04-17 15:33:00) [24]
> Desdechado © (17.04.07 14:03) [8]
> Это обертка для GetLastError, которая возвращает текст ошибки
SysErrorMessage?
--
Regards, LVT.
Desdechado (2007-04-17 14:03:00) [25]Leonid Troyanovsky © (17.04.07 13:14) [7]
> надо показывать как инициализировать TStartupInfo
Странно, никогда нулями не затирал. Иногда заполнял отдельные поля. Все работает.
> какие хендлы нужно закрывать
И не закрывал. В справке как-то расплывчато написаноThe created process remains in the system until all threads within the process have terminated and all handles to the process and any of its threads have been closed through calls to CloseHandle. The handles for both the process and the main thread must be closed through calls to CloseHandle.Я сделал вывод, что это забота вызываемого процесса, а не в вызывающего.
> И что за GetSystemError? Вообще-то, принято Win32Check.
Это обертка для GetLastError, которая возвращает текст ошибки, а не код. А "принято" - на это у каждого свои "понятия".
> Про goto промолчу.
:)
В общем, спасибо за науку.
Leonid Troyanovsky (2007-04-17 13:14:00) [26]> Desdechado © (17.04.07 11:35) [4]
> Тогда неплохо бы указать то самое некачественное место (места). И
Начинающим надо показывать как инициализировать TStartupInfo,
какие хендлы нужно закрывать.
И что за GetSystemError? Вообще-то, принято Win32Check.
Про goto промолчу.
Просто, если ты приводишь свой вариант, отличный от FAQ
(вполне, кстати, достойного примера), то он д.б. по крайней мере,
точней, полезней и т.п.
--
Regards, LVT.
Рамиль (2007-04-17 12:40:00) [27]
> Rlst := CreateProcess('C:WindowsSystem32 otepad.exe', '
> c: eadme.txt', nil, nil, false, NORMAL_PRIORITY_CLASS, nil,
> nil, StartUpInfo, ProcessInfo);
Rlst := CreateProcess('C:\Windows\System32\notepad.exe', ' c:\readme.txt', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
Рамиль (2007-04-17 12:39:00) [28]
var
Rlst: LongBool;
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Error: Cardinal;
begin
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do
begin
cb := SizeOf(TStartUpInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := SW_SHOWNORMAL;
end;
Rlst := CreateProcess('C:WindowsSystem32 otepad.exe', ' c: eadme.txt', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
if Rlst then
with ProcessInfo do begin
WaitForInputIdle(hProcess, INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
end
else Error := GetLastError;
end;
Desdechado (2007-04-17 11:35:00) [29]Leonid Troyanovsky © (17.04.07 11:23) [3]
Тогда неплохо бы указать то самое некачественное место (места). И способы доведения.
Leonid Troyanovsky (2007-04-17 11:23:00) [30]
> Desdechado © (17.04.07 10:56) [2]
> Как пример, не претендующий на полноту
Претендующий на неполноту и некачестенность.
--
Regards, LVT.
Desdechado (2007-04-17 10:56:00) [31]Как пример, не претендующий на полноту и качество:
var
hStartupInfo: TStartupInfo;
hProcInfo: TProcessInformation;
...
if( not CreateProcess( nil, PChar( cAppName + ' ' + cCommandLine ), nil, nil,
False, 0, nil, nil, hStartupInfo, hProcInfo ) ) then
begin
WriteLn( 'Cannot start process.'#13#10'Reason: ' + GetSystemError() );
goto Finish;
end;
if( WaitForSingleObject( hProcInfo.hProcess, INFINITE ) = WAIT_FAILED ) then
begin
WriteLn( 'Process execution failed.' );
goto Finish;
end;
MBo (2007-04-17 08:03:00) [32]в FAQ есть