--- ---

There are several ways of executing files and applications from Delphi. All use the ShellAPI unit and either the ShellExecute or ShellExecuteEx API functions.

## Example 1

Execute NotePad:

    ShellExecute(
      Application.Handle,
      'open',
      'c:\Windows\notepad.exe',
      nil,
      nil,
      SW_SHOWNORMAL
    );

## Example 2

Open `SomeText.txt` in NotePad:

    ShellExecute(
      Application.Handle,
      'open',
      'c:\windows\notepad.exe',
      'c:\SomeText.txt',
      nil,
      SW_SHOWNORMAL
    );

## Example 3

Execute a file according to its extension:

    ShellExecute(
      Application.Handle,
      'open',
      'c:\MyDocuments\Letter.doc',
      nil,
      nil,
      SW_SHOWNORMAL
    );

## Example 4

Open web site or a `*.htm` file with the default web browser.

    ShellExecute(
      Application.Handle,
      'open',
      'https://example.com',
      nil,
      nil,
      SW_SHOWNORMAL
    );

## Example 5

Send an e-mail with a subject and a message body:

    var em_subject, em_body, em_mail: string;

    begin
      em_subject := 'This is the subject line';
      em_body := 'Message body text goes here';
      em_mail := 'mailto:delphi.guide@about.com?subject=' +
        em_subject + '&body=' + em_body ;
      ShellExecute(
        Application.Handle,
        'open',
        PChar(em_mail),
        nil,
        nil,
        SW_SHOWNORMAL
      );
    end;

## Example 6

Execute the Windows Calculator and pop up a message when Calc is terminated.

    uses ShellApi;

    var
      SEInfo: TShellExecuteInfo;
      ExitCode: DWORD;
      ExecuteFile, ParamString, StartInString: string;
    begin
      ExecuteFile:='c:\Windows\Calc.exe';
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        lpFile := PChar(ExecuteFile);
        //lpParameters := PChar(ParamString);
          {ParamString can contain the application parameters.}
        //lpDirectory := PChar(StartInString);
          {StartInString specifies the name of the working directory.
          If ommited, the current directory is used.}
        nShow := SW_SHOWNORMAL;
      end;
      if ShellExecuteEx(@SEInfo) then
      begin
        repeat
          Application.ProcessMessages;
          GetExitCodeProcess(SEInfo.hProcess, ExitCode);
        until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
        ShowMessage('Calculator terminated');
      end
      else
        ShowMessage('Error starting Calc!');
    end;