Самый простой способ запустить какую-то программу из своего приложения — использовать функцию WinExec. Эта функция может работать в любых версиях Windows и выполнять любые файлы.
Функция WinExecопределяется следующим образом:
function WinExec(CmdLine: PChar; CmdShow: integer): integer;
Параметр CmdLine является указателем на строку с нулевым символом в конце, содержащую имя выполняемого файла и, если необходимо, параметры командной строки. Если имя файла указано без пути, то Windows будет искать в каталогах выполняемый файл в следующей последовательности:
Параметр CmdShow определяет форму представления окна запускаемого приложения Windows. Чаще всего используется значение SW_RESTORE, при котором окно запускаемого приложения активизируется и отображается на экране. Если это окно в данный момент свернуто или развернуто, то оно восстанавливается до своих первоначальных размеров и отображается в первоначальной позиции.
При успешном выполнении запуска приложения функция WinExec возвращает значение, большее 31. При неудаче могут возвращаться следующие значения:
Приведем примеры применения WinExec.
Оператор
WinExec('file.exe' , SW_RESTORE)-
запускает программу file.exe.
Оператор
WinExec('COMMAND.COM', SW_RESTORE);
Запускает командную строку.
Более современной, чем WinExec, является функция API Windows CreateProcess, которая и рекомендуется для 32-разрядных приложений:
var lpProcessInformation: TProcessInformation): BOOL;
Функция порождает новый дочерний процесс и его первый поток (нить).
В рамках этого процесса выполняется указанный файл lpApplicationNameс командной строкой lpCommandLine. Впрочем, параметр lpApplicationName может быть равен nil, а имя выполняемого модуля в этом случае должно быть первым элементом командной строки, задаваемой параметром lpCommandLine. Сам выполняемый модуль может быть любого вида: 32-разрядным приложением Windows, приложением MS-DOS и т.п. Однако если из приложения Windows создается процесс MS-DOS, то параметр lpApplicationNameдолжен быть равен nil, а имя файла и его командная строка включаются в lpCommandLine.Так что, как правило, чтобы не ошибиться, проще всегда задавать lpApplicationName= nilи помещать всю информацию в lpCommandLine.
Если путь к файлу не задан, то файл ищется в тех же каталогах и в той же последовательности, которая рассматривалась для функции WinExec.
Параметры lpProcessAttributes, lpThreadAttributes, lpEnvironment, bInheritHandlesопределяют наследование дочерним процессом свойств родительского процесса. Если не вдаваться в подробности наследования, то можно первые три из этих параметров задавать равными nil, а последний — false.
Параметр lpCurrentDirectoryуказывает на строку, определяющую текущий каталог дочернего процесса. Если параметр равен nil, текущий каталог совпадает с родительским.
Параметр dwCreationFlagsопределяет флаги, задающие характеристики создаваемого процесса. Эти флаги определяют тип процесса (например, CREATE_NEW_CONSOLE — создание нового консольного приложения), характер взаимоотношения с родительским процессом и класс приоритета нового процесса:
Параметр IpStartupInfoуказывает на структуру типа TStartupInfo,определяющую основное окно дочернего процесса. Из всех полей этой структуры обязательным для заполнения является только cb — размер в байтах данной структуры. Остальные можно не заполнять, что обеспечит вид окна по умолчанию.
Параметр lpProcessInformationуказывает на структуру TProcessInformation,из которой родительское приложение может получать информацию о выполнении нового процесса. Ее поля обозначают следующее:
Если функцияCreateProcessуспешно выполнена, она возвращает ненулевое
значение (true).Если произошла ошибка — возвращается 0 (false).
Пример:
var
Form1: TForm1;
StartInfo:TStartupInfo;
ProcInfo:TProcessInformation;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(StartInfo, Sizeof(StartInfo),#0);
StartInfo.cb:=sizeof(StartInfo);
if not CreateProcess(nil,'command.com',nil,nil,false,
Create_new_console or high_priority_class, nil,
nil,Startinfo,procInfo)
then
ShowMessage('no') else ShowMessage('yes');
end;
3. Функция ShellExecute(стр 450)
4. Организация многопоточных приложений (стр. 471)
Класс TThread
Одним из способов создания приложения с несколькими потоками является использование компонента типа TThread. TThread— это абстрактный класс, позволяющий создать в приложении отдельную нить выполнения (поток). Для того чтобы ввести TThreadв свое приложение, надо выполнить команду File | New Other и в открывшемся окне Депозитария на странице New выбрать пиктограмму Thread Object.
Созданный при этом модуль будет выглядеть следующим образом: