>>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
|