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

Лабораторная работа №3 Понятие процесса и знакомство с Win32 api Задание:

Используя представленные ниже материалы, разработать на Visual C++ консольное приложение. Приложение должно выполнять следующие команды:

run word – запускает приложение Microsoft Word (использовать WinExec)

run excel – запускает приложение Microsoft Excel (использовать CreateProcess)

open имя_документа – открывает документ с именем имя_документа (в формате Microsoft Word или Microsoft Excel)

exit – завершение работы приложения

Приложение должно контролировать корректность ввода команд. При неверном задании пути выдавать соответствующие сообщение.

Важное замечание

Дескриптор - это уникальное число, которое Windows использует для идентификации. В Windows есть большое количество типов дескрипторов, например:

  • окна

  • меню

  • устройства вывода

  • файлы

  • перья

  • и многие другие.

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

Программируя под Windows мы очень часто используем эти дескрипторы. Существуют ограничения по количеству дескрипторов. Например, количество окон в Windows ограничено, хотя может очень большим. Хуже с другими объектам типа перьев, их намного меньше и если Ваша программа ведет себя не корректно по отношению к дескрипторам, то очень быстро они могут закончиться. В связи с этим общая идеология такая:

  1. Получить дескриптор

  2. Использование

  3. Освободить

Вы можете подобную последовательность наблюдать практически при каждом этапе программирования.

Понятие процесса в Windows

Процесс обычно определяют как экземпляр выполняемой программы, и он состоит из двух компонентов:

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

  • адресного пространства, в котором содержится код и данные всех EXE- и DLL модулей. Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.

Создание процесса

Процесс создается с помощью вызова Win32 API функций CreateProcess, WinExec или LoadModule. Две последние функции являются устаревшими и оставлены лишь для совместимости. В функции WinExec происходит обращение к CreateProcess с параметрами по умолчанию. Иногда пользоваться данной функцией значительно удобнее.

Функция WinExec

UINT WinExec(

LPCSTR lpCmdLine, // строка с именем программы

UINT uCmdShow // вид вывода на экран в смысле скрытая или нормальная и так далее

);

А вот и код с примером, который запускает обычный калькулятор:

// ExecTest.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

void main()

{

cout << WinExec("c:\\windows\\calc.exe",SW_SHOW) << endl;

}

Да эта функция реализованна только для совместимости с Win 16 приложениями, а приложения Win 32 должны реализовывать данную возможность через CreateProcess.

Результатом этой функции может быть несколько кодов, но если код возврата больше 31, то функция выполнена успешно. Вот некоторые коды:

ERROR_BAD_FORMAT формат exe файла неверен

ERROR_FILE_NOT_FOUND файл не найден

ERROR_PATH_NOT_FOUND путь не найден