Создание dll

Как создать dll? Пример простой dll. Пусть dll экспортирует только одну функцию, которая находит сумму двух чисел.

Итак, запускаем мастер создания нового проекта. В первом окне выбираем «Консольное приложение Win32» ( Win32 Consol Application), имя проекта Simplex, жмём ОК. Далее выбираем Параметры приложения —> Тип приложения —> DLL. В папку Заголовочные файлы добавим новый файл (.h) Simplex.h, получаем: Создание dll

В файл Simplex.h добавим код:

Это функция, предназначенная для экспорта, здесь
extern "C" говорит о том, что данная функция доступна из других программ;
__declspec(dllexport) — это модификатор с аргументом, он указывает, что данная функция экспортируется для других программ;
int sum(int a, int b); - это сама функция, предназначенная для экспорта.

Теперь сделаем реализацию этой функции в файле Simplex.cpp:

Выбираем в меню окна Построение —> Построить Simplex.
А теперь откроем Проводник, в нём наш проект Simplex, папку Debug и увидим такую картину: Создание dll

Верхний файл Simplex.dll, с расширением dll, – это и есть наша длл. Кроме него нас здесь интересует второй файл снизу, его тип Object File Library. Ниже мы будем делать приложение для работы с dll и именно эти два файла будем копировать в папку приложения.

Итак, как же нам запустить dll?

Наверх

Работа с dll. Неявное подключение

Теперь рассмотрим использование dll. Для этого сделаем приложение.
Запускаем мастер создания нового проекта. В первом окне выбираем Проект Win32, имя проекта SimplexStart. В Параметрах приложения, в разделе Тип приложения, выбираем Консольное, в Дополнительных параметрах убираем флаг Предварительно скомпилированный заголовок, жмём Готово.

В папку Заголовочные файлы добавим новый файл (.h) SimplexStart.h, получаем: Работа с dll

Далее, внимание, открываем Проводник, в нём наш проект Simplex, папку Debug и скопируем из неё два файла: Simplex.dll и второй снизу Simplex с типом файла Object File Library. Копии этих двух файлов в Проводнике вставим в папку проекта SimplexStart – > SimplexStart, получаем в папке SimplexStart – > SimplexStart: Работа с dll

Вернёмся к проекту. В файл SimplexStart.h вставим строку:

extern "C" __declspec(dllimport) int sum(int a, int b);

аргумент модификатора здесь dllimport.

Изменим код SimplexStart.cpp:

Здесь мы обращаемся к функции sum, которую экспортирует наша длл. Приложение отправит значения аргументов a и b в функцию dll sum(int a, int b), последняя вернёт результат суммирования, который мы сохраним в переменной retVal и выведем его на экран.

И последнее. Надо добавить файл Simplex с типом файла Object File Library к нашему проекту: в Обозревателе решений правой кнопкой по SimplexStart —> Добавить —> Существующий элемент... . В открывшемся окне выбора находим папку нашего проекта, в ней паку SimplexStart, а в ней файл Simplex с типом файла Object File Library, его-то и выбираем. Если появится окно «Подходящие настраиваемые правила построения не найдены», то жмём «Нет» в нём. Получаем: Работа с dll

Увидели Simplex.lib в самом низу картинки? Это то, что нам нужно. Если так не сделать, то получим ошибку: error LNK2019: ссылка на неразрешенный внешний символ. Но нам ошибка error LNK2019: ссылка на неразрешенный внешний символ не грозит, ведь мы подключили к проекту Simplex.lib.

Строим приложение: выбираем в меню окна Построение —> Построить SimplexStart.

Запускаем на исполнение: Отладка —> Запуск без отладки. Получаем: Работа с dll

Наверх

Работа с dll. Явное подключение

Как подключить dll явно? Явное подключение dll рассмотрим на примере. Для этого сделаем приложение. Запускаем мастер создания нового проекта. В первом окне выбираем Проект Win32, имя проекта SimplexStartEx. В Параметрах приложения, в разделе Тип приложения, выбираем Консольное, в Дополнительных параметрах убираем флаг Предварительно скомпилированный заголовок, жмём Готово.

Далее, внимание, открываем Проводник, в нём наш проект Simplex, папку Debug и скопируем из неё файл: Simplex.dll. Копию этого длл файла в Проводнике вставим в папку поекта SimplexStartEx – > SimplexStartEx, получаем в папке SimplexStartEx – > SimplexStartEx: Работа с dll

Изменим файл SimplexStartEx.cpp так:

В строке

typedef int (*P_Sum)(int, int);

мы объявляем новый тип P_Sum - это указатель на функцию.

Строка

HINSTANCE hSimplex = ::LoadLibrary(L"Simplex.dll");

явно загружает библиотеку dll, т.е. нашу Simplex.dll.

Далее

P_Sum pSum = (P_Sum)::GetProcAddress(hSimplex, "sum");

здесь объявляем указатель на функцию типа P_Sum и определяем его, он указывает на функцию sum из длл Simplex.dll.

Теперь, когда у нас есть указатель на функцию, можно к ней обратиться:

int retVal = (*pSum)(1, 2);

в этой строке (*pSum) — это разыменованный указатель на функцию sum, т.е. (*pSum) — новое обозначение функции sum.

После завершения работы с dll её следует выгрузить:

::FreeLibrary(hSimplex);

Получаем: Работа с dll