Level: Newbie-Hacker
Author: The Baker
Date: 2002-04-19
|
Jump to |
|
> Overview |
Running or opening external
programs or files, from DelphiTM applications, is often a necessary
requirement. This article covers the ShellExecute Windows API function, revealing
techniques for running external applications from your Delphi applications.
There are a number of
reasons why you might be interested in running external applications from your
Delphi application. Often programs are segmented into a number of logical
divisions to represent different components of a larger system. Some sub-system
components might include:
·
Main
application
·
Setup/Installer
application
·
System
application (specifying system wide options)
·
Application
server application
·
Reporting
application
·
an
external third party application
As can be seen, there are a
number of reasons why you might need to call an external application. Let's
discuss how we can do this with the ShellExecute command.
The ShellExecute API allows
for the execution (or "running") of external applications. It also
has a number of other uses, however these all involve performing operations on
external files. The syntax for the ShellExecute WinAPI function is:
HINSTANCE ShellExecute(HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
The following is a
description of the parameters for the ShellExecute function.
|
Parameter |
Input/Output |
Description |
|
hwnd |
input |
Handle to the parent
window: needed for error reporting. |
|
lpOperation |
input |
Pointer to a
null-terminated string. This is the action to be performed (the "object
verb") |
|
lpFile |
input |
Pointer to a
null-terminated string that specifies the file or object to execute the
specified verb on. |
|
lpParameters |
input |
Pointer to a
null-terminated string that specifies the parameters to be passed to the
application (if the lpFile is an application file). Otherwise, this should be
NULL. |
|
lpDirectory |
input |
Pointer to a
null-terminated string that specifies the default directory. |
|
nShowCmd |
input |
Flag determining how the
application window will be displayed when it is opened. |
The ShellExecute function will return an error code
if the function fails. This can be retrieved using the GetLastError function. If the error code is
greater than 32, then the function was successful. If it less than or equal to
32 then an error has occurred. For a complete listing of the error codes refer
to the MSDN website (link provided in the further reading section).
The easiest way to
interpret the error code is with the SysErrorMessage(GetLastError) function call. This will map the
appropriate Windows error message returned by the GetLastError API function.
if ShellExecute(Handle, 'print',
PChar('c:\log.txt'), nil, nil, SW_SHOWNORMAL) <= 32 then
ShowMessage(SysErrorMessage(GetLastError));
The ShellExecute function
allows for operations to be executed on programs and application objects. In some
cases, objects may not be able to respond to an operation type. For example,
not all document types support the "print" verb. A list of the
commonly supported verbs include:
|
lpOperation Value |
Result Description |
|
edit |
Opens a document for
editing in an editor. |
|
explore |
Explores the folder,
using Windows Explorer, specified by the lpFile parameter. |
|
find |
Opens the Search form
initiating a search starting from the directory specified in the lpFile
parameter. |
|
open |
Opens the file,
application or folder specified by the lpFile parameter. |
|
print |
Prints the document file
specified by lpFile parameter. |
|
NULL |
More information below |
If NULL is specified then
different functionality will occur depending on the operating system version. The
following is an extract from the MSDN ShellExecute document:
For systems prior to
Microsoft® Windows® 2000, the default verb is used if it is valid and available
in the registry. If not, the "open" verb is used.
For Windows 2000 and later systems, the default verb is used if available. If
not, the "open" verb is used. If neither verb is available, the
system uses the first verb listed in the registry.
If I use the
"open" verb on a .PAS file, nothing happens. If I use NULL instead,
then the .PAS file will be opened in Delphi. The registry defines the
application that is associated with the .PAS file.
The ShellExecute requires
the nShowCmd type. This represents how the new window will
be displayed when it is created via the ShellExecute call.
|
nShowCmd Value |
Result Description |
|
SW_HIDE |
Hides the window and
activates another window. |
|
SW_MAXIMIZE |
Maximizes the specified
window. |
|
SW_MINIMIZE |
Minimizes the specified
window and activates the next top-level window in the z-order. |
|
SW_RESTORE |
Activates and displays
the window. If the window is minimized or maximized, Windows restores it to
its original size and position. An application should specify this flag when
restoring a minimized window. |
|
SW_SHOW |
Activates the window and
displays it in its current size and position. |
|
SW_SHOWDEFAULT |
Sets the show state based
on the SW_ flag specified in the STARTUPINFO structure passed to the
CreateProcess function by the program that started the application. An
application should call ShowWindow with this flag to set the initial show
state of its main window. |
|
SW_SHOWMAXIMIZED |
Activates the window and
displays it as a maximized window. |
|
SW_SHOWMINIMIZED |
Activates the window and
displays it as a minimized window. |
|
SW_SHOWMINNOACTIVE |
Displays the window as a
minimized window. The active window remains active. |
|
SW_SHOWNA |
Displays the window in
its current state. The active window remains active. |
|
SW_SHOWNOACTIVATE |
Activates and displays a
window. Windows restores it to its original size and position. The active
window remains active. |
|
SW_SHOWNORMAL |
Activates and displays a
window. Windows restores it to its original size and position. |
When you call an
application for the first time you should call the SW_SHOWNORMAL flag.
The following is a list of
ShellExecute uses. You will need to add the Windows and ShellAPI units to the
uses clause.
Run an application called
Demo.exe in "C:\apps" directory:
ShellExecute(Handle,NIL,PChar('C:\apps\demo.exe'),
nil,nil,SW_SHOWNORMAL);
Open a file (e.g.
"log.txt"):
ShellExecute(Handle,'open',PChar('c:\log.txt'),
nil,nil,SW_SHOWNORMAL);
Play a music file (e.g.
"ending.mp3"):
ShellExecute(Handle,'play',PChar('c:\ending.mp3'),
nil,nil,SW_SHOWNORMAL);
Print a log file (e.g.
"log.txt"):
ShellExecute(Handle,'print',PChar('c:\log.txt'),
nil,nil,SW_SHOWNORMAL);
Open up Windows Explorer on
C Drive (e.g. "c:"):
ShellExecute(Handle,'explore',PChar('c:\'),
nil,nil,SW_SHOWNORMAL);
Create a new email message
with Outlook or Outlook express:
Procedure
CreateEmail(Const EmailAddr, Subject, Body: String);
var
ConcatEmailStr: String;
Begin
ConcatEmailStr := EmailAddr + '?subject=' + Subject +
'&body=' + Body;
ShellExecute(Handle,'open',PChar(ConcatEmailStr), nil, nil,
SW_SHOWNORMAL);
end;
I hope this article has
provided you with a greater insight into running applications from Delphi and
the ShellExecute WinAPI function. In the next article I will discuss how to
wait for an application to finish before resuming application execution.
For further information on
the ShellExecute WinAPI function refer to the MSDN online library:
ShellExecute Function
|
Performs an operation on a
specified file.
Syntax
HINSTANCE ShellExecute(
HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
Parameters
hwnd
[in] Handle
to a parent window. This window receives any message boxes that an application
produces, such as error reporting.
lpOperation
[in] Pointer
to a null-terminated string, referred to in this case as a verb, that
specifies the action to be performed. The set of available verbs depends on the
particular file or folder. Generally, the actions available from an object's
shortcut menu are available verbs. For more information about verbs and their
availability, see Object Verbs. See Extending Shortcut Menus for
further discussion of shortcut menus. The following verbs are commonly used.
edit
Launches an
editor and opens the document for editing. If lpFile is not a document
file, the function will fail.
explore
Explores
the folder specified by lpFile.
find
Initiates a
search starting from the specified directory.
open
Opens the
file specified by the lpFile parameter. The file can be an executable
file, a document file, or a folder.
print
Prints the
document file specified by lpFile. If lpFile is not a document
file, the function will fail.
NULL
For systems prior to Microsoft®
Windows® 2000, the default verb is used if it is valid and available in the
registry. If not, the "open" verb is used.
For Windows 2000 and later
systems, the default verb is used if available. If not, the "open"
verb is used. If neither verb is available, the system uses the first verb
listed in the registry.
lpFile
[in] Pointer
to a null-terminated string that specifies the file or object on which to
execute the specified verb. To specify a Shell namespace object, pass the fully
qualified parse name. Note that not all verbs are supported on all objects. For
example, not all document types support the "print" verb.
lpParameters
[in] If
the lpFile parameter specifies an executable file, lpParameters
is a pointer to a null-terminated string that specifies the parameters to be
passed to the application. The format of this string is determined by the verb
that is to be invoked. If lpFile specifies a document file, lpParameters
should be NULL.
lpDirectory
[in] Pointer
to a null-terminated string that specifies the default directory.
nShowCmd
[in] Flags
that specify how an application is to be displayed when it is opened. If lpFile
specifies a document file, the flag is simply passed to the associated
application. It is up to the application to decide how to handle it.
SW_HIDE
Hides the
window and activates another window.
SW_MAXIMIZE
Maximizes
the specified window.
SW_MINIMIZE
Minimizes
the specified window and activates the next top-level window in the z-order.
SW_RESTORE
Activates
and displays the window. If the window is minimized or maximized, Windows
restores it to its original size and position. An application should specify
this flag when restoring a minimized window.
SW_SHOW
Activates
the window and displays it in its current size and position.
SW_SHOWDEFAULT
Sets the
show state based on the SW_ flag specified in the STARTUPINFO structure
passed to the CreateProcess function
by the program that started the application. An application should call ShowWindow with this
flag to set the initial show state of its main window.
SW_SHOWMAXIMIZED
Activates
the window and displays it as a maximized window.
SW_SHOWMINIMIZED
Activates
the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE
Displays
the window as a minimized window. The active window remains active.
SW_SHOWNA
Displays
the window in its current state. The active window remains active.
SW_SHOWNOACTIVATE
Displays a
window in its most recent size and position. The active window remains active.
SW_SHOWNORMAL
Activates
and displays a window. If the window is minimized or maximized, Windows
restores it to its original size and position. An application should specify
this flag when displaying the window for the first time.
Return Value
Returns a value greater than 32
if successful, or an error value that is less than or equal to 32 otherwise. The
following table lists the error values. The return value is cast as an
HINSTANCE for backward compatibility with 16-bit Windows applications. It is
not a true HINSTANCE, however. The only thing that can be done with the
returned HINSTANCE is to cast it to an int and compare it with the value
32 or one of the error codes below.
|
0 |
The operating system is out of memory or resources. |
|
ERROR_FILE_NOT_FOUND |
The specified file was not found. |
|
ERROR_PATH_NOT_FOUND |
The specified path was not found. |
|
ERROR_BAD_FORMAT |
The .exe file is invalid (non-Microsoft Win32® .exe
or error in .exe image). |
|
SE_ERR_ACCESSDENIED |
The operating system denied access to the specified
file. |
|
SE_ERR_ASSOCINCOMPLETE |
The file name association is incomplete or invalid. |
|
SE_ERR_DDEBUSY |
The Dynamic Data Exchange (DDE) transaction could
not be completed because other DDE transactions were being processed. |
|
SE_ERR_DDEFAIL |
The DDE transaction failed. |
|
SE_ERR_DDETIMEOUT |
The DDE transaction could not be completed because
the request timed out. |
|
SE_ERR_DLLNOTFOUND |
The specified dynamic-link library (DLL) was not
found. |
|
SE_ERR_FNF |
The specified file was not found. |
|
SE_ERR_NOASSOC |
There is no application associated with the given
file name extension. This error will also be returned if you attempt to print
a file that is not printable. |
|
SE_ERR_OOM |
There was not enough memory to complete the
operation. |
|
SE_ERR_PNF |
The specified path was not found. |
|
SE_ERR_SHARE |
A sharing violation occurred. |
Remarks
This method allows you to
execute any commands in a folder's shortcut menu or stored in the registry.
To open a folder, use either of
the following calls:
ShellExecute(handle, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);
or
ShellExecute(handle, "open", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);
To explore a folder, use:
ShellExecute(handle, "explore", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);
To launch the Shell's Find
utility for a directory, use:
ShellExecute(handle, "find", <fully_qualified_path_to_folder>, NULL, NULL, 0);
If lpOperation is NULL,
the function opens the file specified by lpFile. If lpOperation
is "open" or "explore", the function attempts to open or
explore the folder.
To obtain information about the
application that is launched as a result of calling ShellExecute, use ShellExecuteEx.
Note The
Launch folder windows in a separate process setting in Folder Options
affects ShellExecute. If that option is disabled (the default setting), ShellExecute
uses an open Explorer window rather than launch a new one. If no Explorer
window is open, ShellExecute launches a new one.
Windows 95/98/Me: ShellExecute
is supported by the Microsoft Layer for Unicode. To use this, you must add
certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me
Systems.
Function Information
|
Header |
shellapi.h |
|
Import
library |
shell32.lib |
|
Minimum
operating systems |
Windows NT 3.1, Windows 95 |
See Also