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
- ...
- uses ShellAPI;
- ...
- function ShellExecuteWait(aFilePath: string; aParams: string): boolean;
- var
- lExecInfo: TShellExecuteInfo; // Structura ce contine informatiile necesare pentru apelul functiei ShellExecuteEx
- begin
- Result := True;
- // Daca fisierul nu exista intoarcem False si iesim
- if (not FileExists(aFilePath)) then
- begin
- Result := False;
- Exit;
- end;
- try
- // Initializam structura lExecInfo
- FillChar(lExecInfo, SizeOf(lExecInfo), 0);
- with lExecInfo do
- begin
- cbSize := SizeOf(lExecInfo);
- fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
- Wnd := GetActiveWindow();
- lExecInfo.lpVerb := 'open';
- lExecInfo.lpParameters := PChar(aParams);
- lpFile := PChar(aFilePath);
- nShow := SW_SHOWNORMAL;
- end;
- // Incercam lansarea in executie a procesului folosind functia API ShellExecuteEx
- // Daca procesul este lansat, vom avea un handle catre acesta in structura lExecInfo
- // Astfel vom putea astepta pana cand procesul respectiv este oprit
- if (not ShellExecuteEx(@lExecInfo))
- then
- begin
- Result := False;
- Exit;
- end;
- // Verificam daca avem un handle valid catre proces.
- if (lExecInfo.hProcess <> 0) and (lExecInfo.hProcess <> INVALID_HANDLE_VALUE)
- then
- begin
- // Avem un handle valid, asteptam oprirea procesului
- while (WaitForSingleObject(lExecInfo.hProcess, 100) <> WAIT_OBJECT_0) do
- Application.ProcessMessages;
- CloseHandle(lExecInfo.hProcess);
- end
- else
- Result := False;
- except
- Result := False;
- end;
- end;
Enjoy!
Welcome to BitCell. Click here to register !