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

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

CreateProcess [D7, WinXP]


Alex.rus ©   (2007-08-21 21:36:00) 

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


Anatoly Podgoretsky   (2007-08-22 14:06:00) [1]


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

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


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

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


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


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


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

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


clickmaker   (2007-08-22 10:46:00) [4]


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

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


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

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

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


TUser   (2007-08-22 04:57:00) [6]

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

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

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


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

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

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


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

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

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

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


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


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

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


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

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

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


Vendict   (2007-08-22 01:45:00) [11]

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


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

> 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 00:20:00) [13]

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-21 22:04:00) [14]

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

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

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


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

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


Наверх

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