русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Порождение процесса функцией CreateProcess


Дата добавления: 2013-12-23; просмотров: 2347; Нарушение авторских прав


Запуск внешней программы функцией WinExec

Самый простой способ запустить какую-то программу из своего приложения — использовать функцию WinExec. Эта функция может работать в любых версиях Windows и выполнять любые файлы.

 

Функция WinExecопределяется следующим образом:

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

 

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

1. Каталог, из которого загружено приложение

2. Текущий каталог

3. Системный каталог Windows, возвращаемый функцией GetSystemDirectory

4. Каталог Windows, возвращаемый функцией GetWindowsDirectory

5. Список каталогов из переменной окружения PATH

 

Параметр CmdShow определяет форму представления окна запускаемого приложения Windows. Чаще всего используется значение SW_RESTORE, при котором окно запускаемого приложения активизируется и отображается на экране. Если это окно в данный момент свернуто или развернуто, то оно восстанавливается до своих первоначальных размеров и отображается в первоначальной позиции.

При успешном выполнении запуска приложения функция WinExec возвращает значение, большее 31. При неудаче могут возвращаться следующие значения:

 

 

Приведем примеры применения WinExec.

Оператор

WinExec('file.exe' , SW_RESTORE)-

запускает программу file.exe.

Оператор

WinExec('COMMAND.COM', SW_RESTORE);

Запускает командную строку.

 

Более современной, чем WinExec, является функция API Windows CreateProcess, которая и рекомендуется для 32-разрядных приложений:



function CreateProcessA(

lpApplicationName: PAnsiChar;

lpCommandLine: PAnsiChar;

lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;

bInheritHandles: BOOL;

dwCreationFlags: DWORD;

lpEnvironment: Pointer;

lpCurrentDirectory: PAnsiChar;

const lpStartupInfo: TStartupInfo;

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.

 

Созданный при этом модуль будет выглядеть следующим образом:



<== предыдущая лекция | следующая лекция ==>
ОБРАБОТКА СОБЫТИЙ КЛАВИАТУРЫ И МЫШИ | РАБОТА С ПРИЛОЖЕНИЯМИ WORD И EXCEL


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.