Execute and Run Applications and Files From Delphi Code

Examples Using the ShellExecute Windows API Function

Hispanic man using computer behind glass
Blend Images - DreamPictures/Brand X Pictures/Getty Images

The Delphi programming language provides a quick way to write, compile, package, and deploy applications cross-platform. Although Delphi creates a graphical user interface, there are bound to be times you want to execute a program from your Delphi code. Let's say you have a database application that uses an external backup utility. The backup utility takes parameters from the application and archives the data, while your program waits until the backup finishes.

Maybe you want to open documents presented in a file list box just by double-clicking on them without opening the associated program first. Imagine a link label in your program that takes the user to your home page. What do you say about sending an email directly from your Delphi application through the default Windows email client program?

ShellExecute

To launch an application or execute a file in Win32 environment, use the ShellExecute Windows API function. Check out the help on ShellExecute for a full description of parameters and error codes returned. You can open any document without knowing which program is associated with it—the link is defined in the Windows Registry.

Here are some shell examples. 

Run Notepad

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

Open SomeText.txt With Notepad

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

Display the Contents of the "DelphiDownload" Folder

ShellExecute(Handle,'open',
'c:\DelphiDownload', nil, nil, SW_SHOWNORMAL) ;

Execute a File According to Its Extension

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

Here's how to find an application associated with an extension.

Open a Website or a *.htm File With the Default Web Explorer

ShellExecute(Handle, 'open',
'http://delphi.about.com',nil,nil, SW_SHOWNORMAL) ;

Send an Email With the Subject and the 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@aboutguide.com?subject=' +
    em_subject + '&body=' + em_body ;
  ShellExecute(Handle,'open',
    PChar(em_mail), nil, nil, SW_SHOWNORMAL) ;
end;

Execute a Program and Wait Until It Finishes

The following example uses the ShellExecuteEx API function.

// Execute the Windows Calculator and pop up
// a message when the 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) ;
{
ParamString can contain the
application parameters.
}
// lpParameters := PChar(ParamString) ;
{
StartInString specifies the
name of the working directory.
If ommited, the current directory is used.
}
// lpDirectory := PChar(StartInString) ;
     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;