Пример неявного подключения DLL к приложению
Ниже приведен исходный код приложения MyLibTest1.exe, которое неявно загружает библиотеку MyLib.dll, описанную в примере п. 6.1 и вызывает из нее функцию MyLibFunc(), создает статический (StatObj) и (*pDynObj) динамический объекты класса MyLibClass, вызывает для них из DLL методы этого класса:
// MyLibTest1.cpp: Исходный код приложения, которое неявно загружает DLL
#include "stdafx.h"
#include <stdio.h>
// Объявление экспортируемых DLL идентификаторов внешними в формате C
extern "C"
{
#include "MyLib.h" // Заголовочный файл DLL
}
#pragma comment(lib, "MyLib.lib") // Подключение библиотеки импорта DLL
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
char cBuffer[256]; // Буфер для хранения выводимой строки
int iSqrVar; // Переменная для хранения квадрата переменной x
// Вывод сообщения с помощью функции MyLibFunc() из DLL
MyLibFunc("Неявная загрузка библиотеки MyLib.dll");
// Создание статического объекта StatObj класса MyLibClass из DLL
MyLibClass StatObj;
// Вызов методов класса MyLibClass из DLL
StatObj.SetX(123);
// Переменной iMyLibVar из DLL присваивается значение свойства х объекта
iMyLibVar = StatObj.GetX();
iSqrVar = StatObj.SqrX();
// Формирование строки для вывода в диалоговом окне
sprintf(cBuffer, "iMyLibVar = %d\n iSqrVar = %d", iMyLibVar, iSqrVar);
// Вывод строки с результатами с помощью функции MyLibFunc() из DLL
MyLibFunc(cBuffer);
// Создание динамического объекта *pDynObj класса MyLibClass из DLL
MyLibClass *pDynObj = CreateDynObj();
// Вызов методов класса MyLibClass из DLL через указатель pDynObj
pDynObj->SetX(234);
// Переменной iMyLibVar из DLL присваивается значение свойства х объекта
|
|
iMyLibVar = pDynObj->GetX();
iSqrVar = pDynObj->SqrX();
// Формирование строки для вывода в диалоговом окне
sprintf(cBuffer, "iMyLibVar = %d\n iSqrVar = %d", iMyLibVar, iSqrVar);
// Вывод строки с результатами с помощью функции MyLibFunc() из DLL
MyLibFunc(cBuffer);
DeleteDynObj(pDynObj); // Уничтожение динамического объекта
return 0;
}
В файле с исходным кодом приложения MyLibTest1.cpp после включения в него стандартных заголовочных файлов stdafx.h и stdio.h, с помощью модификатора extern " C " все импортируемые из DLL функции и переменные объявлены внешними в формате C. Это необходимо для того, чтобы в секции импорта компилятор языка C++ не производил расширение имен, а сохранял их в обычном виде в соответствии с соглашениями языка C. Также этим обеспечивается совпадение имен с библиотекой импорта ранее созданной библиотеки MyLib.dll (см. п. 6.1.). Далее в программе с помощью директивы #pragma comment(lib, "MyLib.lib") производится подключение библиотеки импорта DLL.
В главной функции приложения WinMain () выполняются следующие действия:
- объявляются символьный массив cBuffer для хранения выводимой строки с результатами и целая переменная iSqrVar для хранения квадрата переменной x – свойства класса MyLibClass из DLL;
|
|
- вызывается из DLL функция MyLibFunc(), которая выводит в диалоговом окне сообщение "Неявная загрузка библиотеки MyLib.dll";
- создается статический объект StatObj класса MyLibClass из DLL и для него вызываются виртуальные методы SetX(), GetX() и SqrX() этого класса. В результате глобальной переменной iMyLibVar из DLL присваивается значение свойства x, а локальной переменной iSqrVar – значение квадрата свойства x;
- с помощью функции sprintf() в массиве cBuffer производится формирование строки с полученными результатами, после чего функция MyLibFunc() выводит эту строку в диалоговом окне;
- создается динамический объект *pDynObj класса MyLibClass путем вызова функции CreateDynObj() из DLL, которая возвращает адрес этого объекта;
- вызываются виртуальные методы SetX(), GetX() и SqrX() этого класса через указатель на объект pDynObj, в результате чего переменным iMyLibVar и iSqrVar присваиваются соответствующие значения. Затем с помощью функций sprintf() и MyLibFunc() полученные результаты отображаются в диалоговом окне;
- уничтожается динамический объект класса MyLibClass путем вызова функции DeleteDynObj() из DLL с передачей ей указателя на этот объект pDynObj.
После создания приведенного выше файла MyLibTest1.cpp, до начала компиляции, необходимо выполнить следующее:
а) из каталога проекта библиотеки …\MyLib скопировать в каталог проекта приложения …\MyLibTest1 заголовочный файл этой DLL – MyLib.h;
|
|
б) из подкаталога проекта библиотеки …\MyLib\Debug скопировать в каталог проекта приложения …\MyLibTest1 её библиотеку импорта MyLib.lib;
в) из подкаталога проекта библиотеки MyLib.dll …\MyLib\Debug скопировать в подкаталог проекта приложения …\MyLibTest1\Debug файл динамически подключаемой библиотеки MyLib.dll.
В результате компиляции и компоновки будет сформирован файл приложения MyLibTest1.exe, которое в процессе своей загрузки неявно подключит библиотеку MyLib.dll и вызовет требуемые функции из этой DLL.
Дата добавления: 2019-09-13; просмотров: 124; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!