•  
Создано: 04.09.2010 5:13:50 · Исправлено: 04.09.2010 5:16:05 · Прочтений: 21235

Приложение, выполняемое в текущий момент времени в операционной системе, называется процессом (process). Процессу выделяется отдельное адресное пространство, он характеризуется исполняемым кодом и данными, а также потреблением ресурсов операционной системы.

Процессы порождаются запуском новых приложений. В некоторых случаях требуется из работающего приложения запустить на выполнение другое приложение. Например, открыть калькулятор, вызвать программу-архиватор и др. Запуск одной программы из другой называют «порождением дочернего процесса».

Запуск внешней программы из приложения Delphi можно выполнить несколькими способами, предусматривающими использование функций API Windows: WinExec, ShellExecute и CreateProcess.

Проще всего воспользоваться функцией WinExec, которая работает в разных версиях Windows и может выполнять как приложения Windows, так и программы MS DOS:

function WinExec (CmdLine: PChar; CmdShow: integer): integer;

Параметр CmdLine является указателем на строку, содержащую имя исполняемого файла и при необходимости – дополнительные сведения (параметры командной строки). Если имя файла указано без пути, то Windows будет искать его, последовательно просматривая каталоги:

  1. 1) тот, из которого было запущено приложение;
  2. 2) текущий каталог;
  3. 3) системный каталог Windows;
  4. 4) главный каталог Windows;
  5. 5) каталоги, заданные командой PATH (переменной окружения).

Параметр CmdShow определяет способ отображения окна запускаемого приложения. Для приложений Windows этот параметр может принимать большое количество значений. Наиболее часто используются значения SW_RESTORE и SW_SHOWNORMAL, которые активизируют и отображают окно в обычном виде. После запуска новое приложение выполняется вне зависимости от работы вызвавшего его приложения. Функция WinExec возвращает целое число, которое при удачном запуске больше 32. При несостоявшемся запуске сообщений на экран не выводится, функция WinExec возвращается код ошибки (от 0 до 32), который можно обработать программно.

Например, для запуска Калькулятора можно записать:

WinExec(PChar('calc.exe'), SW_ShowNormal);

В следующем примере запускается на выполнение приложение Balls.exe. Так как не указан путь, то это приложение должно быть расположено в одном из просматриваемых Windows каталогов. Учитывая, что при отсутствии возможности запустить приложение Windows не выдаёт сообщений, в примере используется целочисленная переменная cod для обработки ошибки.

procedure TForm1.Button2Click(Sender: TObject);
var cod:byte;
begin
cod:=WinExec('Balls.exe', SW_Restore);
case cod of
0: ShowMessage('Не хватает ресурсов');
2: ShowMessage('Файл не найден');
3: ShowMessage('Путь не найден');
end;
end;

При необходимо можно обеспечить выбор запускаемого приложения пользователем во время работы. В приведённой ниже процедуре обработки щелчка по кнопке Button3 используется стандартное окно диалога OpenDialog1 для задания нужного файла.

procedure TForm1.Button3Click(Sender: TObject);
var cod:byte;
begin
if OpenDialog1.Execute then
begin
cod:= WinExec(PChar(OpenDialog1.FileName), SW_Restore);
if cod=0 then ShowMessage('Не хватает ресурсов');
end;
end;

Функция ShellExecute обладает большими возможностями, она позволяет не только запускать на выполнение заданное приложение, но и открывать документы и печатать их. Например, обычно с документами, имеющими расширение .doc, связан редактор Word, а с документами, имеющими расширение .xls – табличный процессор Excel. Чтобы начать работу с документом, надо запустить соответствующую программу (в данном случае Word или Excel) и открыть нужный файл. Кроме того, функция ShellExecute позволяет открыть указанную папку, то есть запустить программу Проводник с открытой требуемой папкой. Чтобы воспользоваться функцией ShellExecute, необходимо в раздел uses добавить модуль ShellAPI. При вызове функции ShellExecute необходимо указать достаточно много сведений:

function ShellExecute (Wnd:HWnd; Operation, FileName, Parameters, Directory: PChar; CmdShow: integer): THandle;

Параметр Wnd содержит ссылку на окно, из которого запускается новое приложение. Обычно для задания «родительского» окна используют Handle.

Параметр FileName является указателем на строку, содержащую имя файла или каталога. Параметр Operation указывает на строку, задающую выполняемую операцию. Определено три значения: open (открыть файл или каталог), print (напечатать документ), explore (открыть папку). Если этот параметр равен nil, то выполняется команда open.

Параметр Parameters указывает на строку, содержащую передаваемые запускаемому приложению опции. Если же FileName задаёт неисполняемый файл, то значением этого параметра должно быть nil. Параметр Directory указывает на строку с именем каталога по умолчанию. Если имя каталога не задано, то значением этого параметра должно быть nil.

Параметр CmdShow определяет способ отображения окна запускаемого приложения, может принимать те же значения, что и параметр CmdShow функции WinExec.

В качестве результата функция ShellExecute возвращает ссылку на запущенное приложение, значение которой при успешном выполнении больше 32. При неудачном выполнении возвращается код ошибки. Значения кодов ошибки те же, что и для функции WinExec.

Примеры использования функции ShellExecute:

ShellExecute(Handle,'open','calc.exe',nil,nil,SW_ShowNormal);
ShellExecute(Handle,nil,'текст.doc',nil,nil,SW_ShowNormal);
if OpenDialog1.Execute then
ShellExecute(Handle,'open',PChar(OpenDialog1.FileName), nil,nil,SW_Restore);