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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Самый простой способ запустить какую-то программу из своего приложе­ния — использовать функцию WinExec. Эта функция может работать в любых версиях Windows и выполнять любые файлы: приложения Windows, MS-DOS, файлы PIF и т.п. Функция 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. При неудаче могут возвращаться значения, приведенные в таблице 5.4.

Таблица 5.4. Коды ошибок завершения функции WinExec

Значение Номер Описание
    He хватает памяти или ресурсов системы
ERROR_BAD_FORMAT   Ошибочный exe- файл (например, не для Win32.EXE)
ERROR_FILE_NOT_ FOUND   Указанный файл не найден
ERROR_PATH_NOT_ FOUND   Указанный каталог не найден

 

Достоинством функции WinExec является ее совместимость с ранними версиями Windows. Для этого она и сохраняется в Win32, хотя для Win32 рекомендуется пользоваться функцией CreateProcess.

5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute

Функция ShellExecute может не только выполнять заданное приложение, но и открывать документ и печатать его. Под термином «открыть файл документа» понимается выполнение связанного с ним приложения и загрузка в него этого до­кумента. Например, обычно с документами, имеющими расширение.doc, связан Word. В этом случае открыть файл, например, с именем file.doc означает запус­тить Word и передать ему в качестве параметра имя файла file.doc. Кроме описан­ных возможностей функция ShellExecute позволяет открыть указанную папку. Это означает, что будет запущена программа «Проводник» с открытой указанной папкой.

Для использования функции ShellExecute в операторе uses надо добавить мо­дуль ShellAPI. Автоматически Delphi не включает этот модуль в программу.

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

function ShellExecute(Wnd: HWnd; Operation, FileName, Parameters,

Directory: PChar; ShowCmd: Integer): THandle;

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

Параметр Operation указывает на строку с нулевым символом в конце, кото­рая определяет выполняемую операцию. Эта строка может содержать текст «open» (открыть) или «print» (напечатать). Для Windows 95/98 и NT определено еще одно значение: «explore» (исследовать) — открыть папку. Если параметр Operation ра­вен nil, то по умолчанию выполняется операция «open».

Параметр FileName указывает на строку с нулевым символом в конце, кото­рая определяет имя открываемого файла или имя открываемой папки.

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

Параметр Directory указывает на строку с нулевым символом в конце, кото­рая определяет каталог по умолчанию.

Параметр ShowCmd определяет режим открытия указанного файла. Этот па­раметр может иметь множество различных значений. Обычно, как и для функции WinExec, используется значение SW_RESTORE, при котором окно запускаемого приложения активизируется и отображается на экране.

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

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

1. Следующий опера­тор открывает файл документа с именем file.doc, т.е. запускает WinWord (обычно он связан с файлами.doc), загрузив в него указанный файл:

ShellExecute (Handle, nil, ‘file.doc’, nil, nil, SW_RESTORE);

2. Для вывода на печать документа, записывается аналогич­ный оператор, но изменяется значение параметра Operation:

ShellExecute (Handle, ‘print’ ,’ file.doc ‘, nil, nil, SW_RESTORE);

Выполнение этого оператора будет протекать следующим образом. Запустится WinWord, связанный с файлами.doc, в него загрузится файл file.doc, затем из Winword запустится печать с атрибутами по умолчанию, после чего файл file.doc выгрузится из Winword.

3. Оператор открывает приложение Windows «Калькулятор»:

ShellExecute (Handle, ‘open’, ‘Calc’, nil, nil, SW_RESTORE);

4. Следующий пример открывает папку c:\Program Files\Borland:

ShellExecute (Handle, ‘explore’, ‘c:\Program Files\Borland', nil, nil,

SW_RESTORE);

Функция ShellExecute автоматически отыскивает приложение, связанное с типом открываемого документа, и запускает его. Но иногда требуется вызвать явным образом приложение, связанное с каким-то документом, например, чтобы передать ему какие-то дополнительные параметры. Помочь в этом может функция FindExecutable, которая возвращает имя и путь приложе­ния, связанного с указанным файлом. Использование этой функции требует вклю­чения в оператор uses модуля ShellAPI.

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

function FindExecutable (FileName, Directory, Buffer: PChar): THandle;

Она позволяет получить имя выполняемого exe- файла, связанного с файлом, указанным параметром FileName. Параметр Directory определяет каталог по умолчанию. Оба параметра являются указателями на строки с нулевым символом в конце. Параметр Buffer является указателем на буфер в виде строки с нулевым символом в конце, в который функция заносит имя и путь приложения, связанно­го с файлом FileName.

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

Пример применения функции FindExecutable.

Операторы

var APchar:array[0..254] of char;

FindExecutable (‘Exec.doc’, nil, APchar);

приведут к тому, что в массив APchar будет занесено имя приложения, связанного с файлом типа doc, например:

С:\MSOFFICE\WINWORD\WINWORD.ЕХЕ

Создание потока

Для создания потока используется функция CreateThread:

function CreateThread (lpThreadAttributes: Pointer; dwStackSize: DWORD;

lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;

dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle;

Функция возвращает дескриптор потока.

Входные параметры данной функции перечислены в таблице 5.5.

 

Таблица 5.5 Параметры функции CreateThread

Параметр Описание
lpThreadAttributes Указатель на структуру SECURITY_ATTRIBUTES. Если в этом параметре указать nil, то потоку будут присвоены атрибуты защиты по умолчанию.
dwStackSize Размер стека потока. Если в этом параметре передать 0, то создается стек, размер которого указан по умолчанию в заголовке EXE-файла.
lpStartAddress Адрес функции потока, с которой должен будет начать работу создаваемый поток
lpParameter Данные параметр позволяет передавать функции потока какое-либо инициализирующее значение.
dwCreationFlags Дополнительные флаги, управляющие созданием потока. Данный параметр принимает одно из двух значений: 0 (исполнение потока начинается немедленно) и CREATE_SUSPENDED (система создает поток, инициализирует его и приостанавливает до последующих указаний)
lpThreadId Идентификатор потока.

Завершение процесса

Процесс завершается, когда один из его потоков вызывает процедуру ExitProcess:

procedure ExitProcess(uExitCode: UINT);

uExitCode – в эту переменную заносится код завершения процесса.

Если за вызовом этой процедуры в программе присутствует какой-либо код, он никогда не будет выполнен.

Вызов функции TerminateProcess, также завершает процесс. Данная функция имеет следующий вид:

function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL;

где

hProcess – дескриптор завершаемого процесса

uExitCode – в данной переменной возвращается код завершения процесса.

Если функция TerminateProcess успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка – возвращается 0 (false).

Главное отличие функции TerminateProcess от функции ExitProcess в том, что TerminateProcess может вызвать любой поток, любого процесса для завершения другого процесса.

Завершение потока

Поток можно завершить принудительно, вызвав процедуру ExitThread:

procedure ExitThread(dwExitCode: DWORD);

где в переменную dwExitCode заносится код завершения потока.

 

Завершить поток можно также вызвав функцию TerminateThread:

function TerminateThread(hThread: THandle; dwExitCode: DWORD): BOOL;

где hThread - дескриптор завершаемого потока

dwExitCode - в данной переменной возвращается код завершения потока.

Если функция TerminateThread успешно выполнена, она возвращает ненулевое значение (true). Если произошла ошибка – возвращается 0 (false).

В отличие от ExitThread, которая завершает поток, вызывающий данную процедуру, функция TerminateThread завершает любой поток, дескриптор которого указан в параметре hThread.



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 912; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.114.38 (0.012 с.)