Прототип к варианту 5 - Запуск приложений

Страницы работы

Фрагмент текста работы

Обычно они немедленно закрываются (что не приводит к завершению приложения — это лишние манипуляторы).

Структура STARTUPINFO используется функцией CreateProcess для управления многими аспектами создания процесса. Определение этой структуры приведено в приложении Б.

Private Declare Function OpenProcess Lib "kerne!32" (ByVal dwDesiredAccess _

As Long, ByVal blnheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kerne!32" (ByVal hObject As Long) As Long

Универсальная программа должна вызывать диалоговое окно или форму для выбора запускаемого приложения. Соответствующая модификация предоставляется читателю в качестве самостоятельного упражнения.

В одном из простейших способов запуска приложений применяется функция Visual Basic Shell. В Win32 эта функция возвращает идентификатор нового процесса. Если приложение было успешно запущено, наше приложение вызывает первую функцию синхронизации, WaitForTerml.

Идентификатор процесса передается функции WaitForTerml в качестве параметра. Идентификатор процесса уникален на уровне системы, однако он не может напрямую использоваться функциями ожидания, поскольку сам по себе не является объектом. Для получения манипулятора созданного процесса используется функция OpenProcess. При включении повышенной безопасности в NT ее вызов может завершиться неудачей, но в большинстве случаев она работает. Функция WaitForSingleObject приостанавливает нить до закрытия другого процесса. В этом случае приложение действительно полностью «замораживается». В примере Sleeper.vbp на компакт-диске продемонстрирован улучшенный способ приостановки приложения, если вам потребуется это сделать. Функция WaitForTerml возвращает управление после перехода объекта процесса в установленное состояние, что происходит при закрытии приложения. Затем манипулятор процесса необходимо закрыть, чтобы Windows могла удалить объект процесса.

При вызове CreateProcess необходимо предварительно инициализировать структуру STARTUPINFO параметрами создаваемого процесса. Прежде чем использовать структуру, вы должны занести в поле cb ее размер. Инициализация полей пустыми строками и нулями в действительности не нужна, поскольку Visual Basic автоматически обнуляет поля всех создаваемых структур. Затем приложение вызывает функцию WaitForTermZ и переходит в состояние ожидания до завершения запущенного приложения.

Функция WaitForTermZ получает в качестве параметра структуру PROCESS_INFORMATION, возвращаемую функцией CreateProcess. Прежде всего она ожидает завершения инициализации процесса, используя для этого функцию WaitForlnputldle. В данном случае ожидание необязательно, но если бы мы собирались выполнять межпроцессные взаимодействия, оно гарантировало бы, что приложение завершило инициализацию. Затем манипулятор нити закрывается, поскольку в нашем примере он не нужен. Напомню, что закрытие лишнего манипулятора нити никак не влияет на работу приложения.

В WaitForTermZ для ожидания завершения приложения используется метод опроса, а таймер с конечным автоматом (как при ожидании мутекса в примере ckClient) заменен циклом DoEvents. Как вы увидите, в этом случае приложение Launch продолжает работать. Чтобы избавиться от возможных хлопот с повторным входом, мы блокируем кнопку cmdCreateProcess перед входом в цикл DoEvents. Следует подчеркнуть, что данное решение не слишком удачно, поскольку оно зависит от функции DoEvents.

Кнопка cmdShellZ также запускает приложение при помощи функции Visual

Похожие материалы

Информация о работе