Hollosi Information eXchange /HIX/
HIX CODER 1085
Copyright (C) HIX
2001-02-09
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 Re: Delphi - CreateProcess (mind)  61 sor     (cikkei)

+ - Re: Delphi - CreateProcess (mind) VÁLASZ  Feladó: (cikkei)

>>Hogyan tudom azt megtenni, hogy a programom csak akkor kapja
>>vissza a vezerlest, ha a hivott program mar lefuttott?
>
>A kovetkezo fv ezt oldja meg. Ezzel mar nekem is volt problemam, en
>ezt kaptam megoldasnak:
>
>function TfrmMain.WinExecAndWait(FileName: string;
>    Visibility: Integer): Thandle;
>var
>  zAppName: array [0..512] of Char;
>  zCurDir: array [0..255] of Char;
>  WorkDir: String;
>  StartupInfo: TStartupInfo;
>  ProcessInfo: TProcessInformation;
>begin
>  StrPCopy(zAppName, FileName);
>  GetDir(0, WorkDir);
>  StrPCopy(zCurDir, WorkDir);
>  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
>  StartupInfo.cb := Sizeof(StartupInfo);
>  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
>  StartupInfo.wShowWindow := Visibility;
>  if not CreateProcess(nil, zAppName, nil, nil, false,
>      CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
>nil, nil,
>      StartupInfo, ProcessInfo) then
>  begin
>    Result := 0;
>    Exit;
>  end
>  else
>  begin
>    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
>    GetExitCodeProcess(ProcessInfo.hProcess, Result);
>  end;
>end;
A fenti kod alapvetoen jo, bar egy kicsit tul van bonyolitva: pl. azok az
StrPCopy-k es a tombok kideklaralasa teljesen felesleges, mert egyszeruen a
CreateProcess() parameterekent PChar()-ba castolva kell atadni a sztringeket
es kesz. (Ugyancsak erdekes, hogy a zCurDir-t vegul is nem kapja meg a
CreateProcess().)
Mindenesetre komoly ami hiba az az, hogy a rutin vegerol hianyzik a
visszakapott handle-ket lezaro

CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);

utasitasparos (kozvetlenul a GetExitCodeProcess() moge kell rakni). Ti. amig
nincs minden referencia lezarva egy adott handle-re addig a processzt a
Win32 nem pucolja ki a memoriabol es tovabbra is fenntartja a vele tarsitott
eroforrasokat (memoriat, socketeket, stb.). Ez pedig azt jelenti, hogy amig
a parent processz is be nem fejezodik addig minden egyes child processz
inditasa ujabb es ujabb eroforrasokat esz meg, ami vegso soron azok
elfogyasahoz vezethet. Szoval tessek lezarni a handle-ket!
(Es speciel szerintem az is eleg nagy hiba, hogy ha nem sikerul a
CreateProcess() hivas, akkor 0-t ad vissza  a fuggveny, mintha minden ok
lenne. Sokkal jobb lenne ennek jelzesere pl. a -1 ertek...)

Na, mar megint tul sokat jart a szam... ;)

Gabor

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS