Se all'interno di una nostra applicazione volessimo inserire una funzione che esegue un comando esterno in delphi potremo procedere in diversi modi:
- usando la funzione shellexecute
- creando un processo
Nel primo caso si tratta di una funzione appartenente alla libreria ShellApi, quindi come prima cosa nel nostro sorgente dovremo aggiungere alle librerie usate anche quest'ultima:
uses ShellApi;
...
a questo punto possiamo richiamarla all'interno del nostro programma:
ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', nil, nil,SW_SHOWNORMAL) ;
In questo esempio abbiamo lanciato il classico programmino notepad, ma al suo posto potevamo inserire qualsiasi altro applicativo.
un altro esempio potrebbe essere il passaggio di qualche parametro all'avvio del nostro programma:
ShellExecute(Handle,'open', 'c:\windows\notepad.exe','c:\EsempioText.txt', nil, SW_SHOWNORMAL) ;
in questo caso ho scelto di lanciare notepad facendogli leggere il file "c:\EsempioText.txt".
Per mostrare il contenuto di una directory posso lanciare il seguente comando:
ShellExecute(Handle,'open', 'c:\Download', nil, nil, SW_SHOWNORMAL) ;
Per aprire un file in base alla sua estensione:
ShellExecute(Handle, 'open', 'c:\Documenti\lettera.doc',nil,nil,SW_SHOWNORMAL) ;
In quest'ultimo caso verrà lanciata l'applicazione predisposta a leggere i file ".doc"
Per questo motivo se volessimo connetterci ad un sito web useremo questo comando:
ShellExecute(Handle, 'open', 'http://www.compago.it',nil,nil, SW_SHOWNORMAL) ;
per inviare una mail:
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;
Per eseguire un programma aspettandone la fine:
// esegue la calcolatrice di windows e apre una finestra
// che avvisa quando questo viene terminato
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;





