Nieuws
Foto's
Artikelen
Componenten
Applicaties
Kleinkunst

Delphi - Externe applicaties starten

Soms kan het interessant zijn om vanuit je eigen applicatie een andere applicatie op te starten. Vroeger kon dit met de WinAPI functie WinExec. Tegenwoordig is de WinAPI functie ShellExecute (in unit ShellAPI) echter een veel betere keuze. Deze functie kan je gebruiken om een URL te openen, om een mailtje aan te maken, maar zeker ook om andere applicaties te starten of om andere bestanden te openen met het programma dat in de Verkenner gekoppeld is.

De syntax in de Win32 SDK help :

HINSTANCE ShellExecute(
  HWND hwnd,            // handle to parent window
  LPCTSTR lpOperation,  // pointer to string that specifies operation to perform
  LPCTSTR lpFile,       // pointer to filename or folder name string
  LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters 
  LPCTSTR lpDirectory,  // pointer to string that specifies default directory
  INT nShowCmd          // whether file is shown when opened
);

Hierbij is hwnd een handle naar je form of applicatie. De parameter lpOperation is een string en kan 3 waardes aannemen “open”, “print” en “explore”. Voor de laatste parameter nShowCmd zijn er een hele reeks constanten gedefiniëerd. De meest interessante zijn :

  • SW_SHOW Activates the window and displays it in its current size and position.
  • SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window.
  • SW_SHOWMINIMIZED Activates the window and displays it as a minimized window.


Enkele voorbeelden

Een applicatie starten

ShellExecute(Handle, 'open', 'c:\EenApplicatie.exe', nil, nil, SW_SHOW);

Applicatie starten met een extra parameter

ShellExecute(Handle, 'open', 'c:\EenApplicatie.exe', 'C:\EenTekstBestand.txt', nil, SW_SHOW);

Een bestand openen of afdrukken

ShellExecute(Handle, 'open', 'c:\EenBitmap.bmp', nil, nil, SW_SHOW);
ShellExecute(Handle, 'open', 'c:\EenWordDocument.doc', nil, nil, SW_SHOW);
ShellExecute(Handle, ‘print’, 'c:\EenWordDocument.doc', nil, nil, SW_SHOW);

Een map openen met Verkenner

ShellExecute(Handle, 'explore', 'c:\', nil, nil, SW_SHOWMAXIMIZED);

Een URL openen in de standaard webbrowser

ShellExecute(Handle, 'open', 'www.scip.be', nil, nil, SW_SHOW);


Wachten op de externe applicatie

Soms is het echter ook nodig om een externe applicatie te starten en te wachten totdat deze terug afgesloten wordt. De functie ShellExecute schiet dan echter te kort. De WinAPI functies die je dan nodig hebt zijn CreateProcess om een applicatie te starten en WaitForSingleObject om te controleren of deze applicatie afgesloten wordt. In Delphi nieuwsgroepen vind je vaak functies met deze functionaliteit. Ook deze onderstaande ExecuteAndWait functie start een applicatie en wacht totdat deze afgesloten is.

function ExecuteAndWait(const strCommandLine : String; intVisibility: Integer = SW_SHOW) : Cardinal;
var
  StartupInfo : TStartupInfo;
  ProcessInformation : TProcessInformation;
  intWaitState : DWORD;
begin
  Result := 0;
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := intVisibility;

  if (CreateProcess(nil, PChar(strCommandLine), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInformation)) then
  begin
    intWaitState := WaitForSingleObject(ProcessInformation.hProcess, INFINITE);

    if (intWaitState = WAIT_OBJECT_0) then
      if (GetExitCodeProcess(ProcessInformation.hProcess, intWaitState)) then
        Result := intWaitState;

    CloseHandle(ProcessInformation.hProcess);
    CloseHandle(ProcessInformation.hThread);
  end;
end;