Курсовой (ОС)

20 Февраль 2014 →

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ОБНИНСКИЙ ИНСТИТУТ АТОМНОЙ ЭНЕРГЕТИКИ - филиал

федерального государственного автономного образовательного учреждения

высшего профессионального образования

«Национальный исследовательский ядерный университет «МИФИ»

(ИАТЭ НИЯУ МИФИ)

Факультет Кибернетики

Кафедра Компьютерных систем, сетей и технологий

Курсовая работа

по дисциплине «Операционные системы»

Тема работы: Программный интерфейс приложения в Windows 7.

Новые функции Win64 API.

Выполнил: Студент

4 курса гр. ВТ2-С10

Специальности 230101

Карпенко С.В.

Научный руководитель:

Профессор кафедры КССТ

Куликова Н.В.

Обнинск 2013

Введение

3

1. Windows API. Определение и задачи.3

2. Интерфейс программирования приложений Win324

2.1 Расширение функциональности WinMain.6

2.2 Класс окна8

2.3 Создание окна9

2.4 Расширение функциональности WndProc11

3. С чего начать? Переход от Win32 к Win6413

3.1 Операционная система x6413

4. Разработка для x64 с помощью Visual C++18

4.1 Как сделать код совместимым с Win6420

4.2 Отладка23

Заключение25

5. Приложения25

5.1 Приложение 1.25

5.2 Приложение 2.31

Литература40

Введение

На выбор данной темы курсовой работы меня подтолкнул курсовой проект по системному программному обеспечению: "Использование концепции .NET в системном программировании". Над этим проектом я работал в прошлом семестре, в ходе которого я познакомился с платформой разработки приложений .Net FrameWork. Я изучал разные среды разработки, такие как С#, C++ и др. В ходе работы я изучил принципы работы линкеров, трансляторов и компиляторов в данных средах, изучил debugger'ы. Данная работа углубит мои знания в процессе разработки приложений с использованием интерфейса Win32/64 API. В данный момент на мировом рынке активно продвигается операционная система Windows от корпорации Microsoft, т.о. можно сделать вывод, что изучение основ и других аспектов программирования с использованием Win 32/64 API благоприятно повлияет на мою эрудированность в сфере программирования. А знания о переходе от Win32 к Win64 помогут мне разрабатывать актуальные приложения под систему Windows 7/8, которые на данный момент шире всего распространены.

1. Windows API. Определение и задачи.

Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт». Для создания программ, использующих Windows API, «Майкрософт» выпускает комплект разработчика программного обеспечения, который называется Platform SDK, и содержит документацию, набор библиотек, утилит и других инструментальных средств для разработки.

Windows API был изначально спроектирован для использования в программах, написанных на языке Си или C++. Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.

2. Интерфейс программирования приложений Win32

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

Как известно, любое приложение на языках C и C++ должно иметь функцию main. Эта функция является начальной точкой для приложения. Подобным же образом любое приложение Win32 должно иметь функцию WinMain. Синтаксис функции WinMain выглядит следующим образом:

int WINAPI WinMain

(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow);

HINSTANCE hInstance – дескриптор экземпляра приложения. Этот дескриптор содержит адрес начала кода программы в ее адресном пространстве. Дескриптор hInstance чаще всего требуется функциям, работающим с ресурсами программы.

HINSTANCE hPrevInstance – дескриптор предыдущего экземпляра приложения. Этот дескриптор остался от старых версий Windows - скорее всего, вам он никогда не пригодится.

LPSTR lpCmdLine – указатель на начало командной строки, введенной при запуске программы.

int nCmdShow – это значение содержит желаемый вид окна (например, свернутый или развернутый)

Значение, которое возвращается функцией WinMain (тип int) – код завершения программы. Принято, что если программа завершила свое выполнение без ошибок, возвращается 0.

Функция WinMain – первая функция, которая выполнятся в программе (ее еще называют «точка входа» или «entry point»). С нее все начинается, и ею (желательно) все должно закончиться.

Наряду с функцией WinMain, в каждом приложении Win32 также должна быть определена еще одна функция, обычно называемая WndProc и представляющая собой оконную процедуру. Синтаксис функции WndProc выглядит следующим образом:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

При вызове этой функции ей передаются следующие параметры:

HWND hWnd – описатель окна, от которого пришло сообщение.

UINT message – идентификатор сообщения.

WPARAM wParam и LPARAM lParam – параметры сообщения.

Назначением этой функции является обработка сообщений, получаемых приложением от операционной системы. В каком случае приложение получает сообщения от операционной системы? Оно получает их постоянно! Например, представим, что было создано диалоговое окно с кнопкой ОК. Когда пользователь нажимает кнопку, операционная система посылает приложению сообщение, оповещающее о нажатии кнопки. Функция WndProc отвечает за реагирование на это событие. В этом примере соответствующей реакцией на это событие может быть закрытие диалогового окна.

2.1 Расширение функциональности WinMain.

Для начала создайте внутри функции WinMain структуру класса окна типа WNDCLASSEX. Эта структура содержит информацию об окне, такую как используемые в приложении значки, цвет фона окна, отображаемое в заголовке окна название, имя функции процедуры окна и т.д. Типичная структура WNDCLASSEX выглядит следующим образом:

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

После того как класс окна будет создан, необходимо зарегистрировать его. Воспользуйтесь функцией RegisterClassEx, которой следует передать структуру класса окна в качестве аргумента:

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

После того как класс будет зарегистрирован, можно приступать к созданию окна. Используйте функцию CreateWindow, как показано ниже:

static TCHAR szWindowClass[] = _T("win32app");

static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

// Параметры CreateWindow обозначают:

// szWindowClass: имя класса окна

// szTitle: текст, который будет отображаться в титуле

// WS_OVERLAPPEDWINDOW: тип создаваемого окна

// CW_USEDEFAULT, CW_USEDEFAULT: начальные позиции (x, y)

// 500, 100: размеры окна (width, length)

// NULL: предки окна

// NULL: это окно не будет иметь меню

// hInstance: первый параметр для WinMain

// NULL: не используется в этом приложении

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

Эта функция возвращает объект HWND, являющийся дескриптором окна.

2.2 Класс окна

При создании нового окна ему присваивается «Класс окна» (window class). Класс окна задает оконную функцию, используемую по умолчанию. Кроме этого, класс окна задает другие параметры окна, такие, как стиль, меню окна, цвет рабочей области и т.д. Разные классы окон могут указывать на одну и ту же функцию обработки сообщений. Для создания класса его необходимо зарегистрировать.

Итак, регистрация! За нее отвечает функция RegisterClass. В ее параметре необходимо передать указатель на структуру WNDCLASS. Обычно для заполнения структуры и вызова RegisterClass создают отдельную функцию. Но это - дело вкуса.

Вот простейший пример такой функции:

ATOM RegMyWindowClass(HINSTANCE hInst, LPSTR lpzClassName)

{

WNDCLASS wcWindowClass = {0};

//адрес функции обработки сообщений

wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;

//стиль окна

wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;

//дискриптор экземпляра приложения

//название класса

wcWindowClass.hInstance = hInst;

wcWindowClass.lpszClassName = lpzClassName;

//загрузка курсора

wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

//загрузка цвета окон

wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;

//регистрация класса

return RegisterClass(&wcWindowClass);

}

WNDPROC lpfnWndProc – адрес функции обработки сообщений.

HINSTANCE hInstance – уже знакомая переменная, описывающая экземпляр.

LPCTSTR lpszClassName – имя нового класса.

HICON hCursor – описатель курсора мыши.

HBRUSH hbrBackground – цвет рабочей области окна.

Функция RegisterClass возвращает уникальный «описатель класса окна» типа ATOM. Если при регистрации класса произошла ошибка, это значение будет равно нулю. Чтобы узнать, что произошло, можно вызвать функцию GetLastError().

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

2.3 Создание окна

На вашем месте у меня возникло бы желание увидеть те самые пресловутые окна, из-за которых столько шума. Окно в Windows создается функцией CreateWindow. Вот ее прототип:

HWND CreateWindow(LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD wStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

LPVOID lpParam);

Как видите, у функции множество параметров:

LPCTSTR lpClassName – имя класса для создаваемого окна (это имя использовалось при регистрации класса).

LPCTSTR lpWindowName – имя окна.

DWORD dwStyle – стиль окна.

int x – позиция по горизонтали верхнего левого угла окна.

int y – позиция по вертикали.

int nWidth – ширина окна.

int nHeight – высота окна.

HWND hWndParent – используется для создания «дочернего окна» («child window»). Сюда передается описатель «родительского окна» («parent window»).

HMENU hMenu – описатель меню (если hMenu равно нулю, используется меню класса, указанного в lpClassName).

HINSTANCE hInstance – экземпляр приложения.

LPVOID lpParam – указатель на пользовательский параметр окна. Этот указатель со всеми остальными параметрами функции CreateWindow будет занесен в структуру CREATESTRUCT. В сообщениях WM_CREATE или WM_NCCREATE параметр lParam будет содержать указатель на эту структуру.

Функция CreateWindow возвращает уникальный описатель окна HWND. Если функция вернула ноль, значит, во время создания окна произошла ошибка. Какая именно, можно узнать, вызвав функцию GetLastError.

2.4 Расширение функциональности WndProc

Назначением функции WndProc является обработка сообщений, получаемых приложением. Обработка таких сообщений обычно реализуется путем использования функции Switch.

Для начала реализуем обработку сообщения WM_PAINT. Приложение получает это сообщение, когда возникает необходимость в обновлении какой-либо области окна приложения. При создании окна данное сообщение передается для указания на необходимость обновления всего окна.

При обработке сообщения WM_PAINT сперва необходимо вызвать функцию BeginPaint, а в завершение следует вызвать функцию EndPaint. Между вызовами этих двух функций обрабатывается логика по отображению текста, кнопок и других элементов управления в окне. Данное приложение отображает в окне строку "Hello, World!". Для отображения текста следует использовать функцию TextOut.

Обычно приложение обрабатывает множество других сообщений, таких как WM_CREATE и WM_DESTROY. Ниже приведен код простой, но полноценной функции WndProc:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

TCHAR greeting[] = _T("Hello, World!");

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

TextOut(hdc,

5, 5,

greeting, _tcslen(greeting));

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;



Страницы: Первая | 1 | 2 | 3 | ... | Следующая → | Последняя | Одной страницей


See also:
Для студента
Похожие записи

Комментарии закрыты.