Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Примеры создания и использования DLL




Й вариант. Работа с методами класса без использования их номеров

Для реализации этого варианта потребуется выполнить ряд дополнительных действий:

а) в динамически подключаемой библиотеке:

- описать дополнительно две функции для создания и уничтожения динамического объекта класса в DLL;

- все открытые методы в классе необходимо объявить виртуальными.

б) в приложении, которое явно загрузит эту DLL:

- получить адреса функций, которые создают и уничтожают объект класса в DLL с помощью функции GetProcAddress() по их именам;

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

- вызовы виртуальных методов класса производить по их именам, через указатель на динамический объект;

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

Пример. Для библиотеки MyDLL.dll, содержащей класс MyDLLClass необходимо выполнить следующее:

1. Скорректировать библиотеку MyDLL.dll, а именно:

- дополнить её двумя функциями NewObject() и DestroyObject() для создания и уничтожения динамического объекта класса MyDLLClass;

- объявить в DLL функцию ClMyFunc() виртуальной в классе MyDLLClass;

2. Создать приложение MyDLLApp2.exe, которое явно загрузит указанную DLL, создаст объект класса MyDLLClass, вызвав функцию NewObject(), затем вызовет виртуальные методы класса ClMyFunc(), ClVirtFunc() и уничтожит объект, вызвав функцию DestroyObject().

Скорректированный заголовочный файл MyDLL.h для MyDLL.dll будет иметь следующий вид:

Файл MyDLL.h - скорректированный

// Условное определение макроса MyDLL_API

#ifdef MyDLL_EXPORTS

#define MyDLL_API __declspec (dllexport)

#else

#define MyDLL_API __declspec (dllimport)

#endif

// Прототип экспортируемой функции MyDLLFunction

MyDLL_API int MyDLLFunction(void);

// Описание экспортируемого класса MyDLLClass

class MyDLL_API MyDLLClass {

public:

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

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

// Функция ClMyFunc() объявлена виртуальной

virtual int ClMyFunc(void);

virtual int ClVirtFunc(void); // Виртуальная функция

};

// Описание экспортируемой переменной nMyDLLVar

extern MyDLL_API int nMyDLLVar;

// Прототип экспортируемой функции NewObject()

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

MyDLL_API MyDLLClass* NewObject();

// Прототип экспортируемой функции DestroyObject()

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

MyDLL_API void DestroyObject(MyDLLClass *);

Файл MyDLL.cpp с исходным кодом библиотеки MyDLL.dll необходимо дополнить описаниями двух новых функций NewObject() и DestroyObject():

Дополнение к файлу MyDLL.cpp

// Описание функции NewObject()

MyDLLClass* NewObject()

{

return new MyDLLClass;

}

// Описание функции DestroyObject()

void DestroyObject(MyDLLClass *pObj)

{

delete pObj;

}

В файле MyDLLApp2.cpp с исходным кодом программы необходимо записать следующее:

Файл MyDLLApp2.cpp

#include "stdafx.h"

#include "MyDLL.h" …// Явная загрузка библиотеки MyDLL.dllHMODULE hMyDll = LoadLibrary("MyDLL.dll");

// Получение адреса функции NewObject() из DLL

MyLibClass* (*pNewObject)();

(FARPROC &) pNewObject = GetProcAddress(hMyDll, "NewObject");

// Создание динамического объекта класса

MyLibClass *pDynObj = pNewObject();

// Вызов виртуальных методов класса

int iRez1 = pDynObj->ClMyFunc();

int iRez2 = pDynObj->ClVirtFunc();

// Получение адреса функции DestroyObject() из DLL

void (*pDestroyObject)(MyLibClass *);

(FARPROC &) pDestroyObject = GetProcAddress(

hMyDll, "DestroyObject");

// Уничтожение объекта и выгрузка DLL

pDestroyObject(pDynObj);

FreeLibrary(hMyDll);





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


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


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



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




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