Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
uchebnik.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
557.61 Кб
Скачать

1.2.3.2 Описание функции GetProcAddress

Функция GetProcAddress используется для получения адреса экспортируемой из DLL функции или переменной. В качестве входных значений получает дескриптор модуля DLL, в которой находится искомая функция или переменная, и указатель на строку с названием искомой функции или переменной. В результате выполнения формируется адрес функции или переменной.

Пример использования функции GetProcAddress приведен ниже:

PUSH offset DllExportFunctionName; загружается имя функции

PUSH dllHandle; загружается дескриптор модуля DLL

Call GetProcAddress; вызывается функция получения адреса процедуры

CMP EAX,0; сравнивается на равенство 0

JZ ErrorMessage_FunctionNotFound; если равно, то переход на вывод сообщения об ошибке

MOV DllExportFunctionAddress, eax; сохранение адреса в переменной

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

1.2.3.3 Описание функции FreeLibrary

Функция FreeLibrary декриментирует счетчик ссылок на загруженную DLL. Как только счетчик ссылок станет равным 0, DLL выгружается из адресного пространства вызвавшего ее процесса и дескриптор DLL перестает быть действительным.

В качестве входного параметра, функция FreeLibrary использует дескриптор DLL, полученный при её создании. В качестве выходного значения возвращается 0 (если функция не смогла успешно выполниться по какой-либо причине) или какое-то ненулевое значение.

Пример использования функции FreeLibrary приведен ниже:

PUSH DllHandle; загружается дескриптор DLL

Call FreeLibrary; вызывается функция освобождения DLL

JZ ErrorMessage_CantFreeLibrary; если 0, переход на вывод сообщения об ошибке

1.2.4 Описание некоторых api-функций

Взаимодействие пользовательского приложения с ОС осуществляется посредством вызовов API-функций. Как уже говорилось, вызов API-функции предваряется записью параметров этой функции в стек. Результат работы API-функции возвращается либо через область памяти (заполняется какими-либо значениями структура данных, адрес которой был передан в качестве параметра), либо с помощью регистра (как правило. EAX) и определяется назначением API-функции. В начале данного раздела механизм использования API-функций будет рассматриваться более подробно, а поскольку механизм их использования однотипен, в конце раздела API-функции будут просто перечисляться.

1.2.4.1.Функции для создания пользовательского интерфейса

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

Основой пользовательского интерфейса в Windows является, как это не удивительно, окно [5]. Каждое окно относится к тому или иному классу окна. Класс окна - это набор атрибутов, который использует система как шаблон для создания окна. С каждым классом окна ассоциируется специфичная оконная процедура, которая управляет поведением всех окон данного класса, обрабатывая посылаемые сообщения.

Процесс должен зарегистрировать класс окна, прежде чем он сможет создавать окна данного класса. Регистрация класса окна - установка соответствия между именем класса и оконной процедурой, стилем окна и другими атрибутами класса.

Регистрация класса окна осуществляется с помощью функции RegisterClass. Функция RegisterClass существует как в Unicode (RegisterClassW), так и в ANSI (RegisterClassA) версиях. Если регистрация класса происходит с помощью функции RegisterClassW, то приложение информирует ОС о том, что все текстовые параметры сообщений представлены в кодировке Unicode.

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

Описание полей структуры данных WNDCLASS и типы данных представлены в таблице 7.

Таблица 7 - Описание структуры данных WNDCLASS

WNDCLASS Struc

Название поля

Тип в С

Тип в ассемблере

Назначение поля

style;

UINT

DD

Определяет стиль окна

lpfnWndProc;

WNDPROC

DD

Указатель на процедуру окна

cbClsExtra;

int

DD

информация о дополнительных байтах для данной структуры

cbWndExtra;

int

DD

информация о дополнительных байтах для окна

hInstance;

HINSTANCE

DD

дескриптор приложения

hIcon;

HICON

DD

дескриптор загруженной иконки окна

hCursor;

HCURSOR

DD

дескриптор загруженного курсора окна

hbrBackground;

HBRUSH

DD

дескриптор загруженной кисти фона окна

lpszMenuName;

LPCTSTR

DD

имя-идентификатор меню

lpszClassName;

LPCTSTR

DD

определяет имя класса окон

Значения констант (стиль окна, идентификаторы иконок, курсоров и т.п.) можно найти в заголовочном файле WinUser.h, поставляемом со средой разработки Visual Studio. Необходимо обратить внимание, что при заполнении структуры данных типа WNDCLASS используется дескриптор приложения (возвращается после выполнения функции GetModuleHandle), дескриптор загруженной иконки окна (возвращается после выполнения функции LoadIcon), дескриптор загруженного курсора окна (возвращается после выполнения функции LoadCursor) и дескриптор кисти фона окна. В последнем случае можно использовать дескриптор кисти, используемой для окрашивания фона, а можно использовать значение стандартного системного цвета.

После определения параметров окна вызывается функция RegisterClass (см. приложение А).

Существует также и расширенная функция регистрации класса окна RegisterClassEx, которая использует расширенную структуру данных под названием, WNDCLASSEX. Структура данных WNDCLASSEX отличается от рассмотренной выше структуры данных WNDCLASS наличием двух дополнительных полей: cbSize (тип этого поля в языке С "UINT", а в языке ассемблера - DD), определяющий размер структуры данных WNDCLASSEX в байтах; hIconSm (тип этого поля в языке C "HICON", а в языке ассемблера - DD), определяющий дескриптор на маленькую иконку, ассоциированную с классом окна.

В остальном, функции RegisterClass и RegisterClassEx аналогичны.

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

После регистрации класса окна создается экземпляр окна с помощью функции CreateWindow. Функция CreateWindow создает перекрывающееся, всплывающее или дочернее окно. В качестве входных параметров, функция CreateWindow использует следующие данные (таблица 8):

Таблица 8 - Описание параметров функции CreateWindow

Название параметра

Тип в С

Тип в ассемблере

Описание параметры

lpClassName,

LPCTSTR

DD

Указатель на строку с именем класса окна

lpWindowName,

LPCTSTR

DD

Указатель на строку с именем окна

dwStyle,

DWORD

DD

Константа, определяющая стиль окна

x,

int

DD

Горизонтальная координата левого верхнего угла окна

y,

int

DD

Вертикальная координата левого верхнего угла окна

nWidth,

int

DD

Ширина окна в пикселях

nHeight,

int

DD

Высота окна в пикселях

hWndParent,

HWND

DD

Дескриптор порождающего окна

hMenu,

HMENU

DD

Дескриптор меню, используемого окном

hInstance,

HINSTANCE

DD

Дескриптор приложения, создающего окно

lpParam

LPVOID

DD

Указатель на значение, посылаемое окну через структуру CREATESTRUCT, на которую указывает параметр lParam сообщения WM_Create. Этот указатель может быть равен 0.

Функция CreateWindow существует как в Unicode (CreateWindowW), так и в ANSI (CreateWindowA) версиях. Кроме того, вместо стандартной функции CreateWindow можно использовать расширенную версию функции создания окна - CreateWindowEx, также доступную как в Unicode (CreateWindowExW), так и в ANSI (CreateWindowExA) версиях.

В отличии от функции CreateWindow, функция CreateWindowEx позволяет использовать дополнительные стили окна (добавляется поле dwExStyle типа DWORD (DD)).

В результате выполнения функции создания окна типа CreateWindow возвращается дескриптор созданного окна, в противном случае - возвращается нулевое значение.

Перед выходом из функции CreateWindow посылается сообщение WM_Create процедуре окна. Параметр lParam сообщения WM_Create содержит указатель на структуру CREATESTRUCT, определяющую начальные параметры, передаваемые оконной процедуре приложения. Параметры структуры CREATESTRUCT совпадают с параметрами функции CreateWindowEx.

Если в структуре CREATESTRUCT определен стиль окна WS_Visible, то функция CreateWindow посылает все необходимые сообщения для активации и показа окна.

Пример использования функции CreateWindow можно найти в приложении А.

Для показа окна используется функция ShowWindow. В качестве входных параметров функция ShowWindow использует дескриптор окна (получен при создании окна функцией CreateWindow) и параметр, определяющий режим показа окна (таблица 9).

Если окно уже в видимом состоянии на экране, возвращаемое функцией ShowWindow отлично от нуля. Если окно было спрятано - возвращаемое значение равно 0.

Пример использования функции ShowWindow можно найти в приложении А.

Таблица 9 - Описание параметров функции ShowWindow

Название параметра

Тип в С

Тип в ассемблере

Описание параметра

hWnd

HWND

DD

Дескриптор окна, которое необходимо показать

nCmdShow

int

DD

Режим показа окна.

Имена некоторых констант в С (значение констант для использования в ассемблере) приведены ниже:

SW_HIDE (0) - прячет окно и активизирует другое окно

SW_MAXIMIZE (3) - распахивает до максимального размера окно

SW_MINIMIZE (6) - минимизирует окно и активизирует следующее окно верхнего уровня

SW_RESTORE (9) - активизирует и показывает окно. Если окно было минимизировано или распахнуто, то ОС восстанавливает начальные размеры и положение

SW_SHOW (5) - активизирует окно и показывает его в текущих размерах и положении

Для перерисовки клиентской части окна используется функция UpdateWindow. Эта функция посылает сообщение WM_Paint напрямую оконной процедуре. В качестве входных параметров этой функции выступает дескриптор окна, нуждающегося в обновлении. Если функция выполнилась успешно, то возвращаемое значение не равно 0, в противном случае - равно. Пример использования функции UpdateWindow можно найти в приложении А.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]