Different ways of executing applications and files from Delphi #134

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;
Author: Shlomo Abuisak
Contributor: Shlomo Abuisak
Added: 2009/11/05
Last updated: 2009/11/05