rezultat ShellExecuteEx

0

witam, oto moje pytanie:
mam następującą funkcje uruchamiającą program zewnętrzny (konkretnie jest to enkoder plików audio):

function Run_E(App, Param : pchar) : string;
var
TempFilePath : string;
TempFileName : string;
ExitCode : cardinal;
Console :   PShellExecuteInfoA;
begin
TempFileName:=GenerateRandomName+'.wav';
Param:=pchar(AnsiReplaceStr(Param,'%s',TempFileName));
GetMem(Console, SizeOf(ShellExecuteInfoA));
ZeroMemory(Console, SizeOf(ShellExecuteInfoA));
Console.cbSize := SizeOf(ShellExecuteInfoA);
Console.fMask := SEE_MASK_NOCLOSEPROCESS;
Console.nShow := byte(FEncShow);
Console.lpFile := App;
Console.lpParameters:=Param;
Console.lpDirectory:=pchar(FANSIWorkDir);
ShellExecuteEx(Console);
TempFilePath:=FANSIWorkDir+TempFileName;
repeat
WaitForSingleObject(Console.hProcess, 100);
GetExitCodeProcess(Console.hProcess, ExitCode);
until FTerminated or (ExitCode<>STILL_ACTIVE);
if FTerminated then
   begin
   TerminateProcess(Console.hProcess,0);
   WaitForSingleObject(Console.hProcess, infinite);
   FErrorCode:=1006;
   end
else
   result:=Compute(TempFilePath);
CloseHandle(Console.hProcess);
DeleteFile(pChar(TempFilePath));
end;

jak widać
Console.nShow := byte(FEncShow);
funkcja umożliwia otwarcie programu w widocznym oknie. co za tym idzie, użytkownik może ten program skasować. tylko jak zrobić żebym ja o tym wiedział ? to znaczy, czy w pętli

repeat
WaitForSingleObject(Console.hProcess, 100);
GetExitCodeProcess(Console.hProcess, ExitCode);
until FTerminated or (ExitCode<>STILL_ACTIVE);

mogę jakoś takie zamknięcie wykryć ?
(no i nawet jak okno jest niewidoczne to można je przecież z menadżera zamknąć, więc analogicznie to samo pytanie)

0

WaitForSingleObject zakończy oczekiwanie po zamknięciu programu, nieważne czy zamknie się on sam, czy utłucze go użytkownik.
a tak przy okazji - robisz GetMem, ale nie widzę nigdzie FreeMem -> masz wyciek pamięci w swoim komponencie.

0
ŁF napisał(a)

WaitForSingleObject zakończy oczekiwanie po zamknięciu programu, nieważne czy zamknie się on sam, czy utłucze go użytkownik.

tak, ale nie o to chodzi:
jeśli dekompresja zostanie przerwana, to ja muszę o tym wiedzieć że plik WAV który otrzymałem jest niekompletny i odpowiednio na to zareagować (np usuwając go).
(???)

ŁF napisał(a)

a tak przy okazji - robisz GetMem, ale nie widzę nigdzie FreeMem -> masz wyciek pamięci w swoim komponencie.

faktycznie !
przy okazji sprawdzając to i okolice kodu natknąłem się na nieścisłość.
w swoim D6 ent w pomocy Windows SDK znalazłem 2 bezpośrednie odniesienia do funkcji CloseHandle. często korzystam z pomocy ale coś takiego widzę pierwszy raz. albo czegoś nie rozumiem :).

1:

The CloseHandle function closes an open object handle.

BOOL CloseHandle(
HANDLE hObject // handle to object to close
);

Parameters
hObject Identifies an open object handle.

Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
The CloseHandle function closes handles to the following objects:
? Console input or output
? Event file
? File mapping
? Mutex
? Named pipe
? Process
? Semaphore
? Thread
? Token (Windows NT only)

2:

BOOL CloseHandle(HANDLE hObject)

Limitations
This function will close only file handles.

1 użytkowników online, w tym zalogowanych: 0, gości: 1