Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите про использование CreateProcess... [D6, XP]


Страницы:   1 2

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 есть


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо