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

15. Понятие динамически подключаемой библиотеки. Структура dll-библиотеки. Создание dll-библиотеки. Использование dll-библиотеки в программе. Статический и динамический импорт.

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

Причины, по которым нужно применять DLL: • Расширение функциональности приложения. • Возможность использования разных языков программирования. • Более простое управление проектом. • Экономия памяти • Разделение ресурсов. • Упрощение локализации. • Решение проблем, связанных с особенностями различных платформ. • Реализация специфических возможностей.

При разработке DLL Вы сначала создаете заголовочный файл, в котором содержатся экспортируемые из нее переменные (типы и имена) и функции (прототипы и имена). В этом же файле надо определить все идентификаторы и структуры данных, используемые экспортируемыми функциями и переменными. Заголовочный файл включается во все модули исходного кода Вашей DLL. Более того, Вы должны поставлять его вместе со своей DLL, чтобы другие разработчики могли включать его в свои модули исходного кода, которые импортируют Ваши функции или переменные. Единый заголовочный файл, используемый при сборке DLL и любых исполняемых модулей, существенно облегчает поддержку приложения.

При компиляции исходного файла DLL, MYLIBAPI определяется как __declspec(dllexport) до включения заголовочного файла MyLib.h Такой модификатор означает, что данная переменная, функция или С++-класс экспортируется из DLL. Обнаружив такую информацию, компоновщик создает LIB-файл со списком идентификаторов, экспортируемых из DLL. Этот LIB-файл нужен при сборке любого ЕХЕ-модуля, ссылающегося на такие идентификаторы. Компоновщик также вставляет в конечный DLL-файл таблицу экспортируемых идентификаторов - раздел экспорта, в котором содержится список (в алфавитном порядке) идентификаторов экспортируемых функций, переменных и классов. Туда же помещается относительный виртуальный адрес (relative virtual address, RVA) каждого идентификатора внутри DLL-модуля. Директива external обеспечивает возможность статического импорта процедур и функций из DLL. Статически импортируемая процедура и функция всегда ссылается на одну и ту же точку входа в DLL. Расширения Windows поддерживает также динамический импорт, при котором имя DLL и имя или порядковый номер импортируемой процедуры или функции задается во время выполнения.

#include <windows.h>

typedef int (WINAPI *PFN_MyFunction)(char *);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

HINSTANCE hMyDll;

if((hMyDll=LoadLibrary(“MyDLL”))==NULL) return 1;

PFN_MyFunction pfnMyFunction;

pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,”MyFunction”);

int iCode=(*pfnMyFunction)(“Hello”);

FreeLibrary(hMyDll);

return 0;

}