Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

CreateProcess   Найти похожие ветки 

 
Alex.rus ©   (2007-08-21 21:36) [0]

Опишите параметры функции CreatProcess, как их инициализировать? Если можно примерчик с комментариями.


 
Германн ©   (2007-08-21 22:00) [1]

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


 
Юрий Зотов ©   (2007-08-21 22:04) [2]

Э-э-э... страниц на несколько потянет... как думаете, кто-нибудь станет их писать?

http://msdn2.microsoft.com/en-us/library/ms682425.aspx

http://ldvroot.narod.ru/OS.pdf


 
Vendict ©   (2007-08-22 00:20) [3]

Procedure Run(exe:string);
Var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
StartupInfo:TStartupInfo;
c:Cardinal;
hp:THandle;
s:string;
PI:TProcessInformation;
Begin
s:=ExtractFileDir(exe);
ChDir(s);
StrPCopy(zAppName,exe);
StrPCopy(zCurDir,s);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWDEFAULT;
if not CreateProcess(nil,
                     zAppName,                      { указатель командной строки }
                     nil,                           { указатель на процесс атрибутов безопасности }
                     nil,                           { указатель на поток атрибутов безопасности }
                     false,                         { флаг родительского обработчика }
                     CREATE_NEW_CONSOLE or          { флаг создания }
                     NORMAL_PRIORITY_CLASS,
                     nil,                           { указатель на новую среду процесса }
                     nil,                           { указатель на имя текущей директории }
                     StartupInfo,                   { указатель на STARTUPINFO }
                     PI)                            { указатель на PROCESS_INF }
                     then MessageBox(Form1.Handle, "Ошибка!", "Error", 16);
ChDir(ExtractFileDir(Application.ExeName));                    
end;


 
Юрий Зотов ©   (2007-08-22 01:09) [4]

> Vendict ©   (22.08.07 00:20) [3]

Лучше таких примеров не приводить, ибо это пример того, как делать НЕ надо. Потому что он содержит целую кучу лишних операций и дает утечку системных ресурсов.

Вот код, который делает то же самое, но проще и без утечек (а кроме того дает вразумительную диагностику ошибки, если она возникла). Сравните:

procedure Run(CommandLine: string);
var
 SI: TStartupInfo;
 PI: TProcessInformation;
begin
 ZeroMemory(@SI, SizeOf(SI));
 SI.cb := SizeOf(SI);
 Win32Check(CreateProcess(nil, PChar(CommandLine), nil, nil, False, 0, nil, nil, SI, PI));
 CloseHandle(PI.hThread);
 CloseHandle(PI.hProcess)
end;


 
Vendict ©   (2007-08-22 01:45) [5]

буду знать на будущее.
просто данный пример я взял с этого сайта или из faq либо на форуме подсказали, а сейчас поднял из своей проги.


 
Юрий Зотов ©   (2007-08-22 01:50) [6]

> Vendict ©   (22.08.07 01:45) [5]

Вот по этой причине я и предпочитаю давать ссылки не на FAQи там всякие, а на оригинальную документацию. Потому что из FAQа человек слямзит пример с ошибками и будет думать, что все ОК. А если будет писать код САМ, то сначала должен будет прочесть документацию, где все сказано. Да в MSDN и примеры нередко приводятся, но ЭТИМ примерам верить можно.


 
Германн ©   (2007-08-22 02:05) [7]


> Юрий Зотов ©   (22.08.07 01:50) [6]
>
> > Vendict ©   (22.08.07 01:45) [5]
>
> Вот по этой причине я и предпочитаю давать ссылки не на
> FAQи там всякие, а на оригинальную документацию. Потому
> что из FAQа человек слямзит пример с ошибками и будет думать,
>  что все ОК.

Эээ. И пример из [1] тоже содержит ошибки?
Если Да, то я уберу его из своего списка примеров.


 
Юрий Зотов ©   (2007-08-22 02:29) [8]

> Германн ©   (22.08.07 02:05) [7]

Не уверен, что это именно ошибка, но 2 строки я бы поменял местами:

CloseHandle( pi.hThread );  // По логике, это должно быть сначала,
CloseHandle( pi.hProcess ); // а это потом.


 
Юрий Зотов ©   (2007-08-22 02:33) [9]

> Германн ©   (22.08.07 02:05) [7]

А вот то, что освободить хэндл потока можно (и нужно!) ПЕРЕД WaitFor (а не после) - это точно. Хотя это и не ошибка, но зачем держать ненужный ресурс?


 
TUser ©   (2007-08-22 04:57) [10]

> Юрий Зотов ©   (22.08.07 01:09) [4]

Я всегда еще обнуляю PI. Хотя в документации сказано, что это out, и не написано, что это надо делать. Но в примерах (которым можно верить) сделано именно так

http://msdn2.microsoft.com/en-us/library/ms682512.aspx


 
Юрий Зотов ©   (2007-08-22 10:35) [11]

Ну вот... и в MSDN те же неточности... кому ж тогда верить?

Нет счастья в жизни...


 
clickmaker ©   (2007-08-22 10:46) [12]


> Я всегда еще обнуляю PI

хм... никогда не обнулял. проблем не было ни на одной ОС


 
Юрий Зотов ©   (2007-08-22 11:04) [13]

Обнулять ее на фиг не нужно. Там 4 поля и все 4 заполняются в CreateProcess, зачем еще обнуление?


 
Игорь Шевченко ©   (2007-08-22 11:12) [14]

Юрий Зотов ©   (22.08.07 02:29) [8]


> но 2 строки я бы поменял местами:
>
> CloseHandle( pi.hThread );  // По логике, это должно быть
> сначала,
> CloseHandle( pi.hProcess ); // а это потом.


А какая разница ?


 
Anatoly Podgoretsky ©   (2007-08-22 14:06) [15]


> Ну вот... и в MSDN те же неточности... кому ж тогда верить?

в MSDN их меньше чем в других местах.
Правило простое, берешь пример дефакто считай, что он с ошибкой и неполный, пока не доказано противоположное.



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

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
15-1187341097
ajlekceu
2007-08-17 12:58
2007.09.16
Как заставить DOS-приложение работать быстрее?


8-1165527875
devastator
2006-12-08 00:44
2007.09.16
SampleGrabber не работает


2-1187607571
Arks
2007-08-20 14:59
2007.09.16
Как клонировать vcl-объект?


3-1179329587
Sashok2007
2007-05-16 19:33
2007.09.16
Клиент-серверное приложение


1-1183575985
romychk
2007-07-04 23:06
2007.09.16
Кодировка в NMHTTP1