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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
15-1187613383
pasha_golub
2007-08-20 16:36
2007.09.16
SYN flood: как побороть?


15-1187432782
Riply
2007-08-18 14:26
2007.09.16
Удаление анкеты.


15-1187675559
tipman
2007-08-21 09:52
2007.09.16
Delphi .NET в какой версии достойный?


2-1187987876
TPel
2007-08-25 00:37
2007.09.16
Антивирусник учебный


1-1183888184
hgd
2007-07-08 13:49
2007.09.16
Сохранить как картинку





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский