Текущий архив: 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.48 MB
Время: 0.047 c