- •Лабораторная работа №3 Понятие процесса и знакомство с Win32 api Задание:
- •Важное замечание
- •Понятие процесса в Windows
- •Создание процесса
- •Функция WinExec
- •Функция CreateProcess
- •Функция ShellExecute
- •Завершение процесса
- •Возврат управления входной функцией первичного потока
- •Функция ExitProcess
- •Функция TerminateProcess
- •Когда все потоки процесса уходят
- •Переменные окружения
Лабораторная работа №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 ограничено, хотя может очень большим. Хуже с другими объектам типа перьев, их намного меньше и если Ваша программа ведет себя не корректно по отношению к дескрипторам, то очень быстро они могут закончиться. В связи с этим общая идеология такая:
Получить дескриптор
Использование
Освободить
Вы можете подобную последовательность наблюдать практически при каждом этапе программирования.
Понятие процесса в 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 путь не найден