Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример создания динамически подключаемой библиотеки




В качестве примера рассмотрим создание простой динамически подключаемой библиотеки MyLib.dll, содержащей следующие экспортируемые идентификаторы:

- глобальную переменную iMyLibVar целого типа;

- функцию MyLibFunc(), которая выводит диалоговое окно с сообщением;

- класс MyLibClass, который включает приватное свойство x целого типа и открытые методы: конструктор MyLibClass(), деструктор ~MyLibClass(), виртуальные функции SetX(), GetX() и SqrX();

- функцию CreateDynObj(), которая создаёт в куче динамический объект класса MyLibClass;

- функцию DeleteDynObj(), которая уничтожает динамический объект класса MyLibClass.

Для создания такой библиотеки необходимо подготовить два файла: заголовочный файл MyLib.h и файл с исходным кодом MyLib.cpp. Содержимое этих файлов приведено ниже:

// MyLib.h: Заголовочный файл библиотеки MyLib.dll

// Условное определение макроса MYLIB_API в зависимости от MYLIB_EXPORTS

#ifdef MYLIB_EXPORTS

#define MYLIB_API __declspec(dllexport)

#else

#define MYLIB_API __declspec(dllimport)

#endif

 

// Описание переменной iMyLibVar, экспортируемой из MyLib.dll

extern MYLIB_API int iMyLibVar;

 

// Прототип функции MyLibFunc, экспортируемой из MyLib.dll

MYLIB_API void MyLibFunc(PSTR);

 

// Описание класса MyLibClass, экспортируемого из MyLib.dll

class MYLIB_API MyLibClass {

private:

int x; // Приватная переменная x

public:

MyLibClass(void); // Конструктор класса

~MyLibClass(void); // Деструктор класса

virtual void SetX(int); // Функция для задания значения переменной х

virtual int GetX(void); // Функция для получения значения переменной х

virtual int SqrX(void); // Функция для получения квадрата переменной х

};

 

// Прототип экспортируемой из MyLib.dll функции CreateDynObj

// для создания в куче динамического объекта класса MyLibClass

MYLIB_API MyLibClass* CreateDynObj();

 

// Прототип экспортируемой из MyLib.dll функции DeleteDynObj

// для уничтожения динамического объекта класса MyLibClass

MYLIB_API void DeleteDynObj(MyLibClass *);

 

// MyLib.cpp: Исходный код библиотеки MyLib.dll #include "stdafx.h"// Объявление экспортируемых DLL идентификаторов внешними в формате Cextern "C" { #include "MyLib.h" // Заголовочный файл DLL} BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved){ switch (fdwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;} // Инициализация экспортируемой переменной iMyLibVarint iMyLibVar=0; // Описание функции вывода диалогового окна с сообщением MyLibFunc()void MyLibFunc(PSTR pStr){ MessageBox(NULL,pStr,"Сообщение из DLL-функции MyLibFunc()",MB_OK);} // Описания методов класса согласно их прототипам в MyLib.h// Описание конструктора класса MyLibClassMyLibClass::MyLibClass(){ MessageBox(NULL, "Создание объекта класса MyLibClass", "Сообщение из DLL MyLib.dll", MB_OK); }// Описание деструктора класса MyLibClassMyLibClass::~MyLibClass(){ MessageBox(NULL, "Уничтожение объекта класса MyLibClass", "Сообщение из DLL MyLib.dll", MB_OK); }// Описание виртуальной функции SetX()void MyLibClass:: SetX(int a = 0){ x = a; // Задание значения переменной х}// Описание виртуальной функции GetX()int MyLibClass:: GetX(){ return x; // Получение значения переменной х}// Описание виртуальной функции SqrX()int MyLibClass:: SqrX(){ return x*x; // Получение квадрата переменной х } // Описание функции для создания динамического объекта класса MyLibClassMyLibClass* CreateDynObj(){ return new MyLibClass;}// Описание функции для уничтожения динамического объекта класса MyLibClassvoid DeleteDynObj(MyLibClass *pObject){ delete pObject;}

В заголовочном файле библиотеки MyLib.h после условной компиляции #ifdef … #endif, где определяется макрос MYLIB_API, приведены описания экспортируемых из DLL идентификаторов: глобальной переменной iMyLibVar; функции MyLibFunc(); класса MyLibClass, его свойств и методов; функций CreateDynObj() и DeleteDynObj() для создания и уничтожения динамического объекта класса MyLibClass.

В файле с исходным кодом библиотеки MyLib.cpp после включения в него стандартного заголовочного файла stdafx.h, с помощью модификатора extern "C" все экспортируемые DLL функции и переменные объявлены внешними в формате C. Это необходимо для того, чтобы в секции экспорта компилятор языка C++ не производил расширение имен, а сохранял их в обычном виде в соответствии с соглашениями языка C. Тем самым в приложениях обеспечивается возможность получения адресов переменных и функций (кроме классов) по их именам для явно загруженной DLL. При неявном подключении DLL такой проблемы не возникает при условии, что исходные коды библиотеки и приложений обрабатываются одним компилятором. Далее в файле MyLib.cpp приведена функция входа в DLL – DllMain() без обработки уведомлений, а также – описания всех функций, входящих в библиотеку и методов класса MyLibClass.

После трансляции и компоновки этих файлов будут созданы два файла – MyLib.dll (динамически подключаемая библиотека) и MyLib.lib (ее библиотека импорта), которые будут размещены в подкаталоге проекта библиотеки …MyLibDebug.





Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 420; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.