Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_OC _3.doc
Скачиваний:
5
Добавлен:
26.08.2019
Размер:
125.95 Кб
Скачать

Функция ShellExecute

Еще один простой вызов, который можно использовать для запуска программ, - это Shell Execute. Этот вызов во многом напоминает WinExec, однако он поддерживает обработку типов файлов, зарегистрированных графической оболочкой операционной системы. Например, если при помощи Shell Execute вы попробуете запустить файл с расширением ТХТ, будет запущена программа Notepad или любая другая программа, которая используется в вашей системе для просмотра текстовых файлов.

HINSTANCE ShellExecute(

HWND hwnd,

LPCTSTR lpOperation,

LPCTSTR lpFile,

LPCTSTR lpParameters,

LPCTSTR lpDirectory,

INT nShowCmd

);

В качестве аргументов функция ShellExecute принимает дескриптор окна (на случай, если возникнет необходимость в сообщениях об ошибках) и операционную строку, такую как open (открыть), print (распечатать) или explore (исследовать). В качестве операционной строки можно передать NULL-строку. В этом случае указанный вами файл будет открыт (open). Также функции ShellExecute необходимо сообщить имя файла и любые параметры командной строки (обычно NULL). Наконец, последние два аргумента - это текущий каталог и константа функции ShowWindow (как и в случае с WinExec).

Возвращаемое значение точно такое же, как и у WinExec. Если вы указываете в качестве третьего аргумента функции Shell Execute имя исполняемого файла, вы можете не использовать другие аргументы, кроме аргумента параметров командной строки и константы ShowWindow. Для файлов документов (например, ТХТ или DOC) значение этих аргументов обычно равно NULL.

Функцию ShellExecute можно использовать, например, для того, чтобы открыть корневой каталог диска С:

ShellExecute(handle, "open", "c:\\". NULL, NULL, SW_SHOWNORMAL);

Вы можете заменить строку «open» на строку «explore», а также указать в качестве третьего параметра имя абсолютно любого каталога.

Другим аналогичным системным вызовом является вызов ShellExecuteEx. Этот вызов фактически является полным аналогом ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом совпадают с аргументами вызова ShellExecute. Помимо этого по завершении своей работы вызов ShellExecuteEx помещает в одно из полей этой структуры дескриптор вновь запущенного процесса.

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

Процесс можно завершить четырьмя способами:

  • входная функция первичного потока возвращает управление (рекомендуемый способ),

  • один из потоков процесса вызывает функцию ExitProcess (нежелательный способ);

  • поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно);

  • все потоки процесса умирают по своей воле (большая редкость),

Возврат управления входной функцией первичного потока

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

Функция ExitProcess

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

VOID ExitProcess(UINT fuExitCode);

Эта функция завершает процесс и заносит в параметр fuExitCode код завершения процесса. Возвращаемого значения у ExitProcess нет, так как результат ее действия - завершение процесса. Если за вызовом этой функции в программе присутствует какой-нибудь код, он никогда не исполняется. Заметьте, что такой вызов ExitProcess приводит к уничтожению процесса или потока, когда выполнение функции еще не завершилось. Что касается операционной системы, то здесь все в порядке: она корректно очистит все ресурсы, выделенные процессу или потоку. Но в приложении, написанном на С/С++, следует избегать вызова этих функций, так как библиотеке С/С++ скорее всего не удастся провести должную очистку.