Using ShellExecute in Delphi to Launch Applications

How to use ShellExecute functions in Delphi to launch programs and files from your code. Opening files will use the system default editor.

By Tim Trott | Legacy Code | October 28, 2004

To launch an application or execute a file in Win32 environment we will use the ShellExecute Windows API function. ShellExecute is the code equivalent of a user double clicking a file icon. It causes Windows to work out what application the document file is associated with, launch the program and have it load the document file.

If you pass in a .exe file, it will be launched. If you pass in a .txt file, Windows will work out what application opens this file then launch the application and load the file.

As you will see we can open any type of document from our program without knowing which program is associated with it (this link is defined in the Windows Registry).

Be sure to add ShellApi to your Unit's uses clause.

To Run Notepad

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

Open SomeText.txt with Notepad

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

Display the contents of the "DelphiDownload" folder

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

Execute a file according to its extension

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

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

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

Send an e-mail with the subject and the message body

pascal
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(Handle,'open', PChar(em_mail), nil, nil, SW_SHOWNORMAL);
end;

Execute a program and wait until it has finished

The following example uses the ShellExecuteEx API function.

pascal
/ 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:\WindowsCalc.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;
Was this article helpful to you?
 

Related ArticlesThese articles may also be of interest to you

CommentsShare your thoughts in the comments below

If you enjoyed reading this article, or it helped you in some way, all I ask in return is you leave a comment below or share this page with your friends. Thank you.

There are no comments yet. Why not get the discussion started?

We respect your privacy, and will not make your email public. Learn how your comment data is processed.