Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
43
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

33 Структура простої прикладної програми з бібліотекою динамічної компоновки. Послідовність дій при компіляції.

В качестве примера приведем исходные тексты простейшей DLL-библиотеки DLLDemo.DLL, в которой определены всего две функции. Первая из них - это функция инициализации DLLEntryPoint, а вторая - функция FindApplicationWindow.

Функция инициализации DLLEntryPoint в нашем случае не выполняет никакой работы, однако когда она получает управление, на экране появляется одно из четырех сообщений (в зависимости от значения кода причины вызова). В задачу функции FindApplicationWindow входит поиск главного окна приложения по заголовку этого окна. В случае успеха функция FindApplicationWindow возвращает идентификатор первого найденного окна с подходящим заголовком, а при неудаче - значение NULL.

Исходный текст DLL-библиотеки.

Файл dlldemo\dlldemo.c

#include <windows.h>

#include <windowsx.h>

#include "dlldemo.h"

HWND hwndFound; // запись hwnd найденного окна

BOOL WINAPI DLLEntryPoint(

HMODULE hModule, // идентификатор модуля

DWORD fdwReason, // причина вызова функции DLLEntryPoint

LPVOID lpvReserved) // зарезервировано

{

switch(fdwReason)

{ case DLL_PROCESS_ATTACH: // Подключение нового процесса

{ MessageBox(NULL, "Process attached", "DLL Demo", MB_OK);

break; }

case DLL_THREAD_ATTACH: // Подключение новой задачи

{ MessageBox(NULL, "Thread attached", "DLL Demo", MB_OK);

break; }

case DLL_PROCESS_DETACH: // Отключение процесса

{ MessageBox(NULL, "Process detached", "DLL Demo", MB_OK);

break; }

case DLL_THREAD_DETACH: // Отключение задачи

{ MessageBox(NULL, "Thread detached", "DLL Demo", MB_OK);

break; } }

return TRUE;

}

HWND FindApplicationWindow(LPSTR lpszWindowTitle)

{

// Запускаем цикл поиска окна с заголовком,

// адрес которого передан функции через

// параметр lpszWindowTitle

EnumWindows(EnumWindowsProc, (LPARAM)lpszWindowTitle);

// Возвращаем значение глобальной переменной hwndFound,

// которое устанавливается функцией обратного вызова

// EnumWindowsProc в зависимости от результата поиска

return hwndFound;

}

BOOL CALLBACK EnumWindowsProc(

HWND hwnd, // идентификатор родительского окна

LPARAM lParam) // адрес строки заголовка окна

{ char szBuf[512]; // Буфер для хранения заголовка окна

GetWindowText(hwnd, szBuf, 512); // Получаем заголовок окна

If(!strcmp((lpstr)lParam, szBuf)) // Сравниваем заголовок со строкой, адрес которой передан в функцию EnumWindowsProc

{ hwndFound = hwnd;

return FALSE; }

else

{

hwndFound = NULL; // признак того, что окно с заданным заголовком не было найдено

return TRUE;

}

}

Прототипы функций, определенных в нашей DLL-библиотеке.

Файл dlldemo\dlldemo.h

BOOL WINAPI DLLEntryPoint(HMODULE hModule, DWORD fdwReason, LPVOID lpvReserved);

HWND FindApplicationWindow(LPSTR lpszWindowTitle);

BOOL CALLBACK EnumWindowsProc( HWND hwnd, // идентификатор родительского окна

LPARAM lParam); // произвольное значение

Файл определения модуля dlldemo\dlldemo.def DLL-библиотеки

EXPORTS

FindApplicationWindow @1

Последовательность действий при компиляции. В среде MS VC++ 4.0. При создании проекта DLL-библиотеки “с нуля” вы должны указать тип рабочего пространства проекта (New Project Workspace) как Dynamic-Link Library, задать имя и пути. Если в DLL-библиотеке определена точка входа (функция инициализации), то в параметрах проекта надо указать ее имя. Меню Build - Settings. На экране появится диалоговая панель Project Settings, показанная на рис. 3.6. Пользуясь кнопками в правом верхнем углу этой диалоговой панели, откройте страницу Link. Затем выберите из списка Category строку Output. В поле Entry-point symbol введите имя вашей функции инициализации и нажмите кнопку OK. Если вы выполняете редактирование загрузочного модуля DLL-библиотеки в пакетном режиме, при запуске редактора связей укажите параметр /entry:”ИмяФункцииИнициализации”.

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