Импортирование и экспортирование
Импортировать открытые символы в приложение или экспортировать функции из библиотеки DLL можно двумя способами:
с помощью файла определения модуля (DEF) при сборке библиотеки DLL;
с помощью ключевых слов
__declspec(dllimport)
или__declspec(dllexport)
в определении функции в основном приложении.
Использование файла DEF
Файл определения модуля (DEF) — это текстовый файл, содержащий один или несколько операторов модуля, описывающих различные атрибуты библиотеки DLL. Если вы не используете ключевое слово __declspec(dllimport)
или __declspec(dllexport)
для экспорта функций библиотеки DLL, то для библиотеки DLL требуется DEF-файл.
DEF-файлы можно использовать для импорта в приложение или экспорта из библиотеки DLL.
Использование ключевого слова __declspec
Чтобы код компилировался правильно, использовать ключевое слово __declspec(dllimport)
необязательно, но оно позволяет компилятору создавать более качественный код. Происходит это потому, что компилятор может определить, существует ли функция в библиотеке DLL или нет, и создать код без косвенного обращения, которое обычно присутствует в вызове функции, происходящем через границу библиотеки DLL. Однако для импорта переменных, используемых в библиотеке DLL, необходимо применять __declspec(dllimport)
.
При наличии надлежащего раздела EXPORTS в файле DEF ключевое слово __declspec(dllexport)
не требуется. Ключевое слово __declspec(dllexport)
было добавлено для упрощения экспорта функций из EXE- или DLL-файла без использования файла DEF.
Формат переносимых исполняемых файлов Win32 предназначен для сведения к минимуму числа страниц для фиксации импорта. Для этого все адреса импорта для любой программы помещаются в одном месте, которое называется таблицей адресов импорта. Это позволяет загрузчику при обращении к импортируемым функциям изменять только одну или две страницы.