Студопедия

КАТЕГОРИИ:


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




Ниже приведен исходный код приложения MyLibTest2.exe, которое явно загружает библиотеку MyLib.dll, описанную в примере, получает адрес и вызывает из нее функцию MyLibFunc(), создает динамический объект (*pDynObj) класса MyLibClass, вызывает для него методы этого класса:

// MyLibTest2.cpp: Исходный код приложения, которое явно загружает MyLib.dll

#include "stdafx.h"

#include <stdio.h>

#include "MyLib.h" // Заголовочный файл DLL

 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

char cBuffer[256]; // Буфер для хранения выводимой строки

int iSqrVar; // Переменная для хранения квадрата переменной x

 

// Загрузка библиотеки MyLib.dll и получение её описателя

HINSTANCE hMyLib = LoadLibrary("MyLib.dll");

if (hMyLib == NULL)

{

MessageBox(NULL,"DLL не загружена! hMyLib==NULL", "Error", MB_OK);

return 1;

}

 

// Объявление указателя на функцию MyLibFunc() и получение её адреса

void (*pMyLibFunc)(PSTR);

(FARPROC &) pMyLibFunc = GetProcAddress(hMyLib, "MyLibFunc");

if (pMyLibFunc == NULL)

{

MessageBox(NULL, "Адрес функции из DLL не получен!", "Error", MB_OK);

return 1;

}

// Вызов функции MyLibFunc() из DLL через указатель

pMyLibFunc("Явная загрузка библиотеки MyLib.dll");

 

// Объявление указателя на функцию CreateDynObj() и получение её адреса

MyLibClass* (*pCreateDynObj)();

(FARPROC &) pCreateDynObj = GetProcAddress(hMyLib, "CreateDynObj");

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

// функции CreateDynObj() из DLL через её указатель

MyLibClass *pDynObj = pCreateDynObj();

 

// Вызов виртуальных функций класса MyLibClass из DLL производится

// напрямую – по имени, через таблицу адресов виртуальных функций vtable

pDynObj->SetX(234);

// Объявление указателя на переменную iMyLibVar и получение её адреса

int *piMyLibVar;

(FARPROC &) piMyLibVar = GetProcAddress(hMyLib, "iMyLibVar");

// Переменной iMyLibVar из DLL через указатель присваивается

// значение свойства х объекта *pDynObj

*piMyLibVar = pDynObj->GetX();

iSqrVar = pDynObj->SqrX();

// Формирование строки для вывода в диалоговом окне

sprintf(cBuffer, "iMyLibVar = %d iSqrVar = %d", *piMyLibVar, iSqrVar);

// Вызов функции MyLibFunc() из DLL через указатель

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

pMyLibFunc(cBuffer);

 

// Объявление указателя на функцию DeleteDynObj() и получение её адреса

void (*pDeleteDynObj)(MyLibClass *);

(FARPROC &) pDeleteDynObj = GetProcAddress(hMyLib, "DeleteDynObj");

// Уничтожение динамического объекта класса MyLibClass из DLL вызовом

// функции DeleteDynObj() из DLL через её указатель

pDeleteDynObj(pDynObj);

 

FreeLibrary(hMyLib); // Выгрузка библиотеки MyLib.dll

 

return 0;

}

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

В главной функции приложения WinMain() выполняются следующие действия:

- объявляются символьный массив cBuffer для хранения выводимой строки с результатами и целая переменная iSqrVar для хранения квадрата переменной x – свойства класса MyLibClass из DLL;

- с помощью функции LoadLibrary() производится явная загрузка библиотеки MyLib.dll и получение её описателя hMyLib. Если функции не удастся загрузить указанную DLL, то описатель hMyLib получит значение NULL, после его проверки будет выведено соответствующее сообщение и приложение завершит свою работу;

- производится объявление указателя pMyLibFunc на функцию MyLibFunc() и получение её адреса с помощью функции GetProcAddress(). Если ей не удастся найти в DLL функцию с указанным именем, то указатель pMyLibFunc получит значение NULL, после его проверки будет выведено соответствующее сообщение и приложение завершит свою работу;

- через указатель pMyLibFunc вызывается из DLL функция MyLibFunc(), которая выводит в диалоговом окне сообщение "Явная загрузка библиотеки MyLib.dll";

- объявляется указатель pCreateDynObj на функцию CreateDynObj() из DLL и производится получение её адреса с помощью функции GetProcAddress(). Затем создается динамический объект *pDynObj класса MyLibClass вызовом функции CreateDynObj() из DLL через её указатель pCreateDynObj;

- с использованием указателя pDynObj на созданный динамический объект производится вызов виртуальных методов SetX(), GetX() и SqrX() класса MyLibClass из DLL напрямую – по имени, через таблицу адресов виртуальных функций vtable;

- для работы с глобальной переменной iMyLibVar из DLL вначале объявляется указатель piMyLibVar, а затем производится получение её адреса с помощью функции GetProcAddress(). После этого переменной iMyLibVar из DLL через указатель piMyLibVar присваивается значение свойства х объекта *pDynObj класса MyLibClass путем вызова виртуального метода GetX(). В результате вызова виртуального метода SqrX() этого класса локальной переменной iSqrVar присваивается значение квадрата свойства x;

- с помощью функции sprintf() в массиве cBuffer производится формирование строки с полученными результатами, после чего функция MyLibFunc() через указатель pMyLibFunc выводит эту строку в диалоговом окне;

- объявляется указатель pDeleteDynObj на функцию DeleteDynObj() из DLL и производится получение её адреса с помощью функции GetProcAddress(). Затем уничтожается динамический объект *pDynObj класса MyLibClass вызовом функции DeleteDynObj() из DLL через её указатель pDeleteDynObj с передачей ей указателя на этот объект pDynObj;

- производится явная выгрузка библиотеки MyLib.dll из адресного пространства процесса с помощью функции FreeLibrary().

После создания приведенного выше файла MyLibTest2.cpp, до начала компиляции, необходимо выполнить следующее:

а) из каталога проекта библиотеки …MyLib скопировать в каталог проекта приложения …MyLibTest2 заголовочный файл этой DLL – MyLib.h;

б) из подкаталога проекта библиотеки MyLib.dll …MyLibDebug скопировать в подкаталог проекта приложения …MyLibTest2Debug файл динамически подключаемой библиотеки MyLib.dll.

В результате компиляции и компоновки будет сформирован файл приложения MyLibTest2.exe, которое в процессе своего выполнения явно подключит библиотеку MyLib.dll и вызовет требуемые функции из этой DLL.

 





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


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


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



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




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