![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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