Delphi - Pornire aplicatie, asteptare pana la inchiderea ei

Delphi - Pornire aplicatie, asteptare pana la inchiderea ei

Postby v0id » 31 Oct 2010, 01:08

Cel mai simplu mod de a lansa un proces in executie este prin folosirea functiei API ShellExecute. Uneori insa, este posibil sa fie nevoie sa asteptam pana cand procesul lansat de noi este oprit si abia apoi executia aplicatiei noastre sa continue.

Putem realiza acest lucru folosind functia ShellExecuteEx. Aceasta difera de ShellExecute prin faptul ca primeste un singur parametru, si anume o structura ShellExecuteInfo. Pentru a lansa un proces in executie este nevoie sa populam aceasta structura pe care apoi sa o transmitem ca parametru lui ShellExecuteEx. Daca apelul acestei functii reuseste si procesul este lansat, vom fi "rasplatiti" cu un handle (o referinta) catre proces, care va fi transmis inapoi tot in structura ShellExecuteInfo. Sunt cateva exceptii de la aceasta regula, dar daca cititi documentatia veti afla mai exact despre ce e vorba.

Cei care sunt familiarizati cu ShellExecute nu ar trebui sa intampine probleme majore cu ShellExecuteEx. Un exemplu de utilizare aveti mai jos, functia numita ShellExecuteWait.

Parametri ShellExecuteWait:
1. aFilePath - calea catre fisierul executabil sau catre un fisier ce va fi deschis folosind aplicatia asociata extensiei acelui fisier
2. aParams - parametrii ce vor fi transmisi procesului lansat in executie

Rezultat ShellExecuteWait:
True - procesul a fost pornit
False - nu s-a pornit procesul sau a aparut o exceptie

  1.  
  2. ...
  3.  
  4. uses ShellAPI;
  5.  
  6. ...
  7.  
  8. function ShellExecuteWait(aFilePath: string; aParams: string): boolean;
  9. var
  10.   lExecInfo: TShellExecuteInfo;  // Structura ce contine informatiile necesare pentru apelul functiei ShellExecuteEx
  11. begin
  12.   Result := True;
  13.  
  14.   // Daca fisierul nu exista intoarcem False si iesim
  15.   if (not FileExists(aFilePath)) then
  16.     begin
  17.       Result := False;
  18.       Exit;
  19.     end;
  20.  
  21.   try
  22.     // Initializam structura lExecInfo
  23.     FillChar(lExecInfo, SizeOf(lExecInfo), 0);
  24.     with lExecInfo do
  25.       begin
  26.         cbSize := SizeOf(lExecInfo);
  27.         fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
  28.         Wnd := GetActiveWindow();
  29.         lExecInfo.lpVerb := 'open';
  30.         lExecInfo.lpParameters := PChar(aParams);
  31.         lpFile := PChar(aFilePath);
  32.         nShow := SW_SHOWNORMAL;
  33.       end;
  34.  
  35.     // Incercam lansarea in executie a procesului folosind functia API ShellExecuteEx
  36.     // Daca procesul este lansat, vom avea un handle catre acesta in structura lExecInfo
  37.     // Astfel vom putea astepta pana cand procesul respectiv este oprit
  38.     if (not ShellExecuteEx(@lExecInfo))
  39.       then
  40.         begin
  41.           Result := False;
  42.           Exit;
  43.         end;
  44.  
  45.     // Verificam daca avem un handle valid catre proces.
  46.     if (lExecInfo.hProcess <> 0) and (lExecInfo.hProcess <> INVALID_HANDLE_VALUE)
  47.       then
  48.         begin
  49.           // Avem un handle valid, asteptam oprirea procesului
  50.           while (WaitForSingleObject(lExecInfo.hProcess, 100) <> WAIT_OBJECT_0) do
  51.             Application.ProcessMessages;
  52.  
  53.           CloseHandle(lExecInfo.hProcess);
  54.         end
  55.       else
  56.         Result := False;
  57.   except
  58.     Result := False;
  59.   end;
  60. end;
  61.  


Enjoy!
3p / 1 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 39.5

Return to Snippets

Who is online

Users browsing this forum: No registered users and 1 guest