Создание dll
Как создать dll? Пример простой dll. Пусть dll экспортирует только одну функцию, которая находит сумму двух чисел.
Итак, запускаем мастер создания нового проекта. В первом окне выбираем «Консольное приложение Win32» ( Win32 Consol Application), имя проекта Simplex, жмём ОК. Далее выбираем Параметры приложения —> Тип приложения —> DLL. В папку Заголовочные файлы добавим новый файл (.h) Simplex.h, получаем:
В файл Simplex.h добавим код:
Это функция, предназначенная для экспорта, здесь
extern «C» говорит о том, что данная функция доступна из других программ;
__declspec(dllexport) — это модификатор с аргументом, он указывает, что данная функция экспортируется для других программ;
int sum(int a, int b); — это сама функция, предназначенная для экспорта.
Теперь сделаем реализацию этой функции в файле Simplex.cpp:
Выбираем в меню окна Построение —> Построить Simplex.
А теперь откроем Проводник, в нём наш проект Simplex, папку Debug и увидим такую картину:
Верхний файл Simplex.dll, с расширением dll, – это и есть наша длл. Кроме него нас здесь интересует второй файл снизу, его тип Object File Library. Ниже мы будем делать приложение для работы с dll и именно эти два файла будем копировать в папку приложения.
Итак, как же нам запустить dll?
Работа с dll. Неявное подключение
Теперь рассмотрим использование dll. Для этого сделаем приложение.
Запускаем мастер создания нового проекта. В первом окне выбираем Проект Win32, имя проекта SimplexStart. В Параметрах приложения, в разделе Тип приложения, выбираем Консольное, в Дополнительных параметрах убираем флаг Предварительно скомпилированный заголовок, жмём Готово.
В папку Заголовочные файлы добавим новый файл (.h) SimplexStart.h, получаем:
Далее, внимание, открываем Проводник, в нём наш проект Simplex, папку Debug и скопируем из неё два файла: Simplex.dll и второй снизу Simplex с типом файла Object File Library. Копии этих двух файлов в Проводнике вставим в папку проекта SimplexStart – > SimplexStart, получаем в папке SimplexStart – > SimplexStart:
Вернёмся к проекту. В файл SimplexStart.h вставим строку:
аргумент модификатора здесь dllimport.
Изменим код SimplexStart.cpp:
Здесь мы обращаемся к функции sum, которую экспортирует наша длл. Приложение отправит значения аргументов a и b в функцию dll sum(int a, int b), последняя вернёт результат суммирования, который мы сохраним в переменной retVal и выведем его на экран.
И последнее. Надо добавить файл Simplex с типом файла Object File Library к нашему проекту: в Обозревателе решений правой кнопкой по SimplexStart —> Добавить —> Существующий элемент… . В открывшемся окне выбора находим папку нашего проекта, в ней паку SimplexStart, а в ней файл Simplex с типом файла Object File Library, его-то и выбираем. Если появится окно «Подходящие настраиваемые правила построения не найдены», то жмём «Нет» в нём. Получаем:
Увидели Simplex.lib в самом низу картинки? Это то, что нам нужно. Если так не сделать, то получим ошибку: error LNK2019: ссылка на неразрешенный внешний символ. Но нам ошибка error LNK2019: ссылка на неразрешенный внешний символ не грозит, ведь мы подключили к проекту Simplex.lib.
Строим приложение: выбираем в меню окна Построение —> Построить SimplexStart.
Запускаем на исполнение: Отладка —> Запуск без отладки. Получаем:
Работа с dll. Явное подключение
Как подключить dll явно? Явное подключение dll рассмотрим на примере. Для этого сделаем приложение. Запускаем мастер создания нового проекта. В первом окне выбираем Проект Win32, имя проекта SimplexStartEx. В Параметрах приложения, в разделе Тип приложения, выбираем Консольное, в Дополнительных параметрах убираем флаг Предварительно скомпилированный заголовок, жмём Готово.
Далее, внимание, открываем Проводник, в нём наш проект Simplex, папку Debug и скопируем из неё файл: Simplex.dll. Копию этого длл файла в Проводнике вставим в папку поекта SimplexStartEx – > SimplexStartEx, получаем в папке SimplexStartEx – > SimplexStartEx:
Изменим файл SimplexStartEx.cpp так:
В строке
мы объявляем новый тип P_Sum — это указатель на функцию.
Строка
явно загружает библиотеку dll, т.е. нашу Simplex.dll.
Далее
здесь объявляем указатель на функцию типа P_Sum и определяем его, он указывает на функцию sum из длл Simplex.dll.
Теперь, когда у нас есть указатель на функцию, можно к ней обратиться:
в этой строке (*pSum) — это разыменованный указатель на функцию sum, т.е. (*pSum) — новое обозначение функции sum.
После завершения работы с dll её следует выгрузить:
Получаем:
Вот так работаем с dll.