Delphi - Externe applicaties starten
- Datum:
- Auteur: Stefan Cruysberghs
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;