Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Теоретические сведения. Dynamic-Link Library (DLL) создаются подобно обычным исполняемым модулям, но при этом в среде разработки Visual Studio необходимо выбрать проект типа Win32



Dynamic-Link Library (DLL) создаются подобно обычным исполняемым модулям, но при этом в среде разработки Visual Studio необходимо выбрать проект типа Win32 Dynamic-Link Library. Как и каждая программа на языке программирования C++, динамически подключаемая библиотека должна иметь главную функцию, которая отмечает точку входа в программу при ее исполнении операционной системой. В отличие от исполняемых модулей, в которых эта функция называется main, в DLL главная функция называется DllMain и вызывается операционной системой при загрузке DLL в адресное пространство процесса и при создании этим процессом нового потока. Главное назначение функции DllMain заключается в инициализации DLL при ее загрузке, а также захвате и освобождении необходимых ресурсов при создании и завершении нового потока в процессе. Эта функция имеет следующий прототип:

BOOL WINAPI DllMain(

HINSTANCE hinstDLL, // дескриптор DLL

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

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

);

При успешном завершении функция DllMain должна вернуть значение true, а в случае неудачи — значение false. Параметры функции DllMain имеют следующее назначение. В параметре hinstDLL операционная система Windows передает дескриптор DLL, который фактически равен виртуальному адресу, по которому загружена DLL. Параметр fdwReason может иметь одно из следующих значений, которое указывает на причину, по которой операционная система вызывает функцию DllMain:

- DLL_PROCESS_ATTACH — DLL загружена в адресное пространство процесса;

- DLL_THREAD_ATTACH — в процессе создан новый поток и функция DllMain вызывается в контексте этого потока;

- DLL_THREAD_DETACH — в процессе завершается поток и функция DllMain вызывается в контексте этого потока;

- DLL_PROCESS_DETACH — DLL выгружается из адресного пространства процесса.

Параметр lpvReserved совместно со значением параметра fdwReason отмечает способ загрузки и выгрузки DLL из адресного пространства процесса. Если значение параметра fdwReason равно DLL_PROCESS_ATTACH, то значение параметра lpvReserved, равное null, указывает на то, что DLL загружается динамически при при помощи одной из функций LoadLibrary или LoadLibraryEx. Любое другое значение параметра lpvReserved в этом случае указывает на то, что DLL загружается статически. Если значение параметра fdwReason равно DLL_PROCESS_DETACH, то значение параметра lpvReserved, равное null, указывает на то, что DLL выгружается динамически при помощи функции FreeLibrary. Любое другое значение параметра lpvReserved в этом случае указывает на то, что DLL выгружается при завершении процесса.

Сделаем следующее замечание относительно функции DllMain. Если эта функция не реализована в DLL, то компилятор автоматически сгенерирует эту функцию, которая всегда будет возвращать значение true. Теперь рассмотрим, как оформляются функции и переменные, которые DLL предоставляет в использование своим клиентам. Во-первых, заметим, что такие функции и переменные называются экспортируемыми. Для того чтобы сделать функцию или переменную экспортируемой, нужно определить их с модификатором extern "С" и квалификатором declspec(dllexport).

Кроме того, экспортируемая переменная должна быть инициализирована. Модификатор extern "С" указывает компилятору на то, что функция или переменная должна иметь имя в стиле языка программирования С. То есть имя функции или переменной не будет искажаться путем добавления к нему обозначений типов данных из сигнатуры функции или определения переменной. Модификатор declspec(dllexport) указывает компилятору на то, что данная функция или переменная будет экспортироваться из DLL.

В листинге ниже приведен код DLL, в которой определяются переменная count и две функции Add и Sub. Переменная count исполняет роль счетчика, а функции Add и sub соответственно прибавляют и вычитают из счетчика некоторое число.

#include <windows.h>





Дата публикования: 2015-10-09; Прочитано: 316 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...