Допустим, имеется приложение, работающие с базой данных, которое использует внешнюю утилиту для резервного копирования данных. Эта утилита получает параметры из Вашего приложения и делает резервное копирование данных, а приложение ждет, пока утилита не закончит работу.
А с другой стороны, Вы хотели когда-либо открыть документы, которые представлены в ListBox, только дважды щелкнув по ним без необходимости открывать связанную с этим документом программу?
Наконец, вообразите Label-ссылку в Вашей программе, которая перенесет пользователя на связанную с ней страницу (запуская Internet Explorer). Кроме того, что Вы скажете относительно отсылки электронной почты непосредственно из Вашего Delphi приложения через почтового клиента Windows по умолчанию (например, MS Outlook Express)?
ShellExecute
Чтобы запустить приложение или выполнить файл в среде Win32, мы будем использовать функцию Windows API ShellExecute. Как Вы увидите, можно открыть любой тип документа из Вашей программы без того, чтобы узнавать какая программа связана с этим документом в системном реестре.
Давайте посмотрим на это в действии!
Убедитесь, что добавили ShellApi в раздел uses Вашего модуля!
Запустить Блокнот
uses , ShellApi;
ShellExecute(Handle, 'open' , 'C:\Windows\Notepad.exe' ,
nil , nil , SW_SHOWNORMAL) ;
|
Открыть Untitled.txt и Запустить Блокнот
ShellExecute(Handle, 'open' , 'C:\Windows\Notepad.exe' ,
'C:\Untitled.txt' , nil , SW_SHOWNORMAL) ;
|
Отобразить Содержимое Папки "Temp"
ShellExecute(Handle, 'open' , 'C:\Temp' ,
nil , nil , SW_SHOWNORMAL) ;
|
Выполнить Файл по Его Расширению
ShellExecute(Handle, 'open' , 'C:\MyDocuments\Test.doc' ,
nil , nil , SW_SHOWNORMAL) ;
|
Открыть Сайт или *.htm Файл с Заданным по Умолчанию Браузером
nil , nil , SW_SHOWNORMAL) ;
|
Послать Электронное Письмо с Темой и Текстом Сообщения
var em_subject, em_body, em_mail : string ;
begin
em_subject := 'Это тема сообщения' ;
em_body := 'Текст самого сообщения' ;
em_mail := 'mailto:
pupkin@yandex . ru?subject=' +
em_subject + '&body=' + em_body ;
ShellExecute(Handle, 'open' ,
PChar (em_mail), nil , nil , SW_SHOWNORMAL) ;
end ;
|
Запустить Программу и Ждать Ее Завершения
Этот пример использует функцию API ShellExecuteEx:
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) ;
nShow := SW_SHOWNORMAL;
end ;
if ShellExecuteEx(@SEInfo) then begin
repeat
Application . ProcessMessages;
GetExitCodeProcess(SEInfo . hProcess, ExitCode) ;
until (ExitCode <> STILL_ACTIVE) or
Application . Terminated;
ShowMessage( 'Калькулятор завершил работу' ) ;
end
else ShowMessage( 'Ошибка запуска Калькулятора!' ) ;
end ;
|
Комментарии