КАТЕГОРИИ: Архитектура-(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; Просмотров: 340; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |