Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

Подскажите про использование CreateProcess...   Найти похожие ветки 

 
vegarulez ©   (2007-04-17 07:56) [0]

Хочу использовать вызов батника, и ещё одного *.ехе из своей проги. по таймеру. Но нужно знать завершил ли работу батник и экзешник, для этого хочу пользовать не WinExec (как сечас пользую), а CreateProcess, чтобы можно было опрашивать состояние, завершил ли уже работу батник и экзешник. Чтобы запускать их только в том случае если их уже нет. Но в CreateProcess столько параметров... прям запутался...  Если можно дайте какой нить кусочек кода с вызовом, и опросом состояния - чтобы понять что к чему. И если есть ссыль на хорошее описание - тоже просьба поделиться.


 
MBo ©   (2007-04-17 08:03) [1]

в FAQ есть


 
Desdechado ©   (2007-04-17 10:56) [2]

Как пример, не претендующий на полноту и качество:

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;


 
Leonid Troyanovsky ©   (2007-04-17 11:23) [3]


> Desdechado ©   (17.04.07 10:56) [2]

> Как пример, не претендующий на полноту

Претендующий на неполноту и некачестенность.

--
Regards, LVT.


 
Desdechado ©   (2007-04-17 11:35) [4]

Leonid Troyanovsky ©   (17.04.07 11:23) [3]
Тогда неплохо бы указать то самое некачественное место (места). И способы доведения.


 
Рамиль ©   (2007-04-17 12:39) [5]

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;


 
Рамиль ©   (2007-04-17 12:40) [6]


> 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);


 
Leonid Troyanovsky ©   (2007-04-17 13:14) [7]

> Desdechado ©   (17.04.07 11:35) [4]

> Тогда неплохо бы указать то самое некачественное место (места). И

Начинающим надо показывать как инициализировать TStartupInfo,
какие хендлы нужно закрывать.

И что за GetSystemError? Вообще-то, принято Win32Check.
Про goto промолчу.

Просто, если ты приводишь свой вариант, отличный от FAQ
(вполне, кстати, достойного примера), то он д.б. по крайней мере,
точней, полезней и т.п.

--
Regards, LVT.


 
Desdechado ©   (2007-04-17 14:03) [8]

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 15:33) [9]


> Desdechado ©   (17.04.07 14:03) [8]

> Это обертка для GetLastError, которая возвращает текст ошибки

SysErrorMessage?

--
Regards, LVT.


 
Desdechado ©   (2007-04-17 16:11) [10]

> SysErrorMessage?
Почти. Немного другой набор параметров для FormatMessage + дополнительные навороты.

По поводу инициализации я понял, почему у меня не было ошибок. hStartupInfo: TStartupInfo у меня обычно глобальная переменная.

А по поводу закрытия хэндлов. Их таки обязательно в вызывающей программе закрывать? А то я так и не понял из справки...


 
Игорь Шевченко ©   (2007-04-17 17:58) [11]

Desdechado ©   (17.04.07 16:11) [10]

Ну собственно поэтому пример и претендует на неполноту и некачественность


 
Leonid Troyanovsky ©   (2007-04-17 18:09) [12]


> Desdechado ©   (17.04.07 16:11) [10]

> Почти. Немного другой набор параметров для FormatMessage
> + дополнительные навороты.

Вот. А в приведенном тобой коде оного нет.

> По поводу инициализации я понял, почему у меня не было ошибок.
>  hStartupInfo: TStartupInfo у меня обычно глобальная переменная.

Нужна и инициализация и, минимально, заполнение cb.

> А по поводу закрытия хэндлов. Их таки обязательно в вызывающей

Возьми за правило закрывать. Т.е., как только стали не нужны - сразу.
Например, хендл потока в рассмотренных примерах - сразу после
удачного CreateProcess.
Утечка хендлов, к сожалению, довольно распространненый грех.

--
Regards, LVT.


 
vegarulez ©   (2007-04-18 09:04) [13]

В данной беседе речь ведётся о вот этом примере из FAQ?

http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15


 
Игорь Шевченко ©   (2007-04-18 10:57) [14]


> В данной беседе речь ведётся о вот этом примере из FAQ?


В этом примере, как минимум, неясно отчего CreateProcess не добился успеха


 
Desdechado ©   (2007-04-18 11:30) [15]

> Возьми за правило закрывать. Хендл потока в рассмотренных примерах -
> сразу после удачного CreateProcess.
Ну, в моем он еще используется для ожидания окончания, поэтому, наверно, не сразу после создания, а сразу после завершения ожидания.

> В этом примере, как минимум, не ясно отчего CreateProcess не добился успеха
Ага, значит, мой пример чем-то все-таки точней, а то
> Leonid Troyanovsky ©   (17.04.07 13:14) [7]
> если ты приводишь свой вариант, отличный от FAQ, то он д.б. точней, полезней
;)


 
vegarulez ©   (2007-04-18 11:36) [16]

Кстати я не совсем понимаю... почему


...
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
...


Не убивают процесс???... Они только Хендлы грохают чтоли???

потому как я использую в качестве теста блокнот cmdline:="c:\windows\notepad.exe";
и комментирую
//WaitForSingleObject( pi.hProcess, INFINITE );

Когда WaitForSingleObject( pi.hProcess, INFINITE ); не закоментарен  - то программа начинает работать только после закрытия блокнота. Когда закоментарен она работает всегда - и создаёт "блокноты", но вот вопрос...

при создании нового блокнота хендлы предыдущих грохаются? получается так?


 
Игорь Шевченко ©   (2007-04-18 11:48) [17]


> при создании нового блокнота хендлы предыдущих грохаются?
>  получается так?


handle имеет смысл только в твоей программе.


 
Leonid Troyanovsky ©   (2007-04-18 11:52) [18]


> Desdechado ©   (18.04.07 11:30) [15]

> > В этом примере, как минимум, не ясно отчего CreateProcess
> не добился успеха
> Ага, значит, мой пример чем-то все-таки точней, а то

Для уточнения ему бы хватило: Win32Check(CreateProcess(..));
твой же исходный вариант потребовал больше уточнений.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-04-18 11:54) [19]


> Desdechado ©   (18.04.07 11:30) [15]

> Ну, в моем он еще используется для ожидания окончания, поэтому,
>  наверно, не сразу после создания, а сразу после завершения
> ожидания.

Ты использовал хендл процесса, хендл потока можно закрыть сразу.

--
Regards, LVT.


 
Desdechado ©   (2007-04-18 12:07) [20]

Leonid Troyanovsky ©   (18.04.07 11:52) [18]
1. Написано же чем-то точней.
2. Ну ты формалист. Я же смайл поставил.


 
vegarulez ©   (2007-04-18 13:02) [21]

Так всё таки - блокноты остаются живыми
при
//WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

т.е. эта команда CloseHandle - убивает тока хендл, но не зарубает процесс или приложение. Так? ...

Тогда ещё пара вопросов попутно:
1. какой комндой можно отследить что i-тый блокнот с j-ым хендлом ещё открыт... а раз открыт гоу -ту 2

2. как убить приложение до отчистки хендл (какой командой это сделать, передав в неё хендл, а уже потом его отчистив)?


 
Игорь Шевченко ©   (2007-04-18 13:08) [22]


> т.е. эта команда CloseHandle - убивает тока хендл, но не
> зарубает процесс или приложение. Так? ...


в данном случае так.


> 1. какой комндой можно отследить что i-тый блокнот с j-ым
> хендлом ещё открыт... а раз открыт гоу -ту 2


FindWindow + GetWindowProcessId, учесть, что кроме handle возвращается еще и Id процесса.


> 2. как убить приложение до отчистки хендл (какой командой
> это сделать, передав в неё хендл, а уже потом его отчистив)?
>


а) послать окну сообщение WM_CLOSE
б) сказать TerminateProcess

в) а нафига тебе куча блокнотов ?


 
Desdechado ©   (2007-04-18 13:08) [23]

BOOL TerminateProcess(hProcess, uExitCode)
HANDLE hProcess; /* handle to the process */
UINT uExitCode; /* exit code for the process */
The TerminateProcess function terminates the given process and all of its threads.


 
vegarulez ©   (2007-04-18 13:26) [24]


> Игорь Шевченко ©   (18.04.07 13:08) [22]


> в) а нафига тебе куча блокнотов ?


Я на них тренируюсь, т.к. до этого не работал с CreateProcess :)
Реально мне требуется запускать батник и экзешник, но только в том случае если они уже отработали и закрылись и сами закрылись....  Поэтому я сначала их хочу с помощью креате процесса создавать чтобы контролировать состояние их работы... и если требуется убивать. Если же их нет(уже отработали или убились), то запускать.


 
Leonid Troyanovsky ©   (2007-04-18 13:30) [25]


> Desdechado ©   (18.04.07 12:07) [20]

> 1. Написано же чем-то точней.

Дык, надо было "хоть в чем-то точней" :)

Ладно, не дуйся, получилось может и занудно,
но надеюсь, что полезно.

--
Regards, LVT.


 
Игорь Шевченко ©   (2007-04-18 13:45) [26]


> Реально мне требуется запускать батник и экзешник, но только
> в том случае если они уже отработали и закрылись и сами
> закрылись


если это твой EXEшник - создавай в нем mutex, например


 
vegarulez ©   (2007-04-19 06:56) [27]


> Игорь Шевченко ©   (18.04.07 13:45) [26]


А можно попдробней что это и с чем едят?... если можно то ссыль на описание.


 
vegarulez ©   (2007-04-19 08:36) [28]

Также хочу спросить какой коммандой можно проверить что процесс, или приложение запущено и работает?...


 
vegarulez ©   (2007-04-19 12:27) [29]

up


 
ANB ©   (2007-04-19 13:32) [30]


> Также хочу спросить какой коммандой можно проверить что
> процесс, или приложение запущено и работает?...

Запущено твоей программой или отдельно ?


 
vegarulez ©   (2007-04-20 07:00) [31]

Моей.


 
vegarulez ©   (2007-04-28 07:08) [32]

Удалено модератором
Примечание: Создание пустых сообщений



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.04 c
15-1176986639
Kerk
2007-04-19 16:43
2007.05.20
Четверговая задачка


2-1177757214
Steep
2007-04-28 14:46
2007.05.20
Диалог выбора директории


15-1177168718
Pazitron_Brain
2007-04-21 19:18
2007.05.20
Как создать swap файл при загрузке установшика netbsd?


15-1176820561
ANB
2007-04-17 18:36
2007.05.20
Чего с зарплатой будет ?


1-1175002757
msgipss
2007-03-27 17:39
2007.05.20
Прочитать скопированные из Excel в буфер обмена данные





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский