Выполнение приложений из кода Delphi
А с другой стороны, Вы хотели когда-либо открыть документы, которые представлены в 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 Файл с Заданным по Умолчанию Браузером
ShellExecute(Handle, 'open', 'http://delphiru.ru', 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:
// Запустить Калькулятор Windows и вывести // сообщение, когда Калькулятор закончит работу. 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 может содержать дополнительные параметры. } // lpParameters := PChar(ParamString) ; { StartInString определяет имя рабочего каталога Если нет, используется текущий каталог. } // 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('Калькулятор завершил работу') ; end else ShowMessage('Ошибка запуска Калькулятора!') ; end;
Комментарии