Monday, October 29, 2007

Executing and Running Applications and Files from Delphi Code

Executing and Running Applications and Files from Delphi Code

How many times have you wanted to execute some program from your Delphi application?

Let's say we have a database application that uses some external backup utility. The back up utility takes parameters from your application, archives data, while your program waits until backup finishes.

On the other hand, have you ever needed to open documents presented in a file listbox, just by double clicking on them, without opening the associated program first?

Finally, imagine a link-label in your program that will take the user to your home page (by executing the Internet Explorer). Moreover, what do you say about sending an e-mail directly from your Delphi application through default Windows e-mail client program (like MS Outlook Express).


To launch an application or execute a file in Win32 environment we will use the ShellExecute Windows API function.
Check out the help on ShellExecute for full description of parameters and error codes returned.
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).

Let's see some shell action!
Be sure to add ShellApi to your Unit's uses clause.

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) ;
Open web site or a *.htm file with the default web explorer

ShellExecute(Handle, 'open', '',nil,nil, SW_SHOWNORMAL) ;
Send an e-mail with the subject and the message body

var em_subject, em_body, em_mail : string;
em_subject := 'This is the subject line';
em_body := 'Message body text goes here';

em_mail := '' +
em_subject + '&body=' + em_body ;

PChar(em_mail), nil, nil, SW_SHOWNORMAL) ;

Execute a program and wait until it has finished. The following example uses the ShellExecuteEx API function.

// Execute the Windows Calculator and pop up
// a message when the Calc is terminated.
uses ShellApi;
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
ExecuteFile, ParamString, StartInString: string;

FillChar(SEInfo, SizeOf(SEInfo), 0) ;
SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
with SEInfo do begin
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) ;
if ShellExecuteEx(@SEInfo) then begin
GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
until (ExitCode <> STILL_ACTIVE) or
ShowMessage('Calculator terminated') ;
else ShowMessage('Error starting Calc!') ;

1 comment:

Anonymous said...

Good work
keep it up