Создание библиотеки динамической компоновки

Чтобы создать библиотеку динамического канала (DLL), необходимо создать один или несколько файлов исходного кода и, возможно, файл компоновщика для экспорта функций. Если вы планируете разрешить приложениям, используюющим библиотеку DLL для использования динамической компоновки во время загрузки, необходимо также создать библиотеку импорта.

Создание исходных файлов

Исходные файлы библиотеки DLL содержат экспортированные функции и данные, внутренние функции и данные, а также необязательную функцию точки входа для библиотеки DLL. Вы можете использовать любые средства разработки, поддерживающие создание библиотек DLL на основе Windows.

Если библиотека DLL может использоваться многопоточных приложений, следует сделать библиотеку DLL "потокобезопасной". Чтобы избежать повреждения данных, необходимо синхронизировать доступ ко всем глобальным данным библиотеки DLL. Кроме того, необходимо обеспечить связь только с библиотеками, которые являются потокобезопасными. Например, Microsoft Visual C++ содержит несколько версий библиотеки времени выполнения C, которая не является потокобезопасной и двумя.

Экспорт функций

Как указать, какие функции в библиотеке DLL следует экспортировать, зависит от средств, которые вы используете для разработки. Некоторые компиляторы позволяют экспортировать функцию непосредственно в исходном коде с помощью модификатора в объявлении функции. В других случаях необходимо указать экспорт в файле, который передается компоновщику.

Например, с помощью Visual C++можно экспортировать функции DLL: с модификатором __declspec(dllexport) или с файлом определения модуля (.def). Если вы используете модификатор __declspec(dllexport), то использовать файл не нужно .def . Дополнительные сведения см. в статье "Экспорт из библиотеки DLL".

Создание библиотеки импорта

Файл библиотеки импорта (.lib) содержит сведения, необходимые компоновщику для разрешения внешних ссылок на экспортированные функции DLL, чтобы система могли находить указанные библиотеки DLL и экспортированные функции DLL во время выполнения. При сборке библиотеки DLL можно создать библиотеку импорта для библиотеки DLL.

Дополнительные сведения см. в разделе "Создание библиотеки импорта и экспорт файла".

Использование библиотеки импорта

Например, чтобы вызвать функцию CreateWindow , необходимо связать код с библиотекой User32.libимпорта. Причина в том, что CreateWindow находится в системной библиотеке DLL с именем User32.dllи User32.lib используется библиотека импорта, используемая для разрешения вызовов в коде для экспортированных функций.User32.dll Компоновщик создает таблицу, содержащую адрес каждого вызова функции. Вызовы функций в библиотеке DLL будут исправлены при загрузке библиотеки DLL. Хотя система инициализирует процесс, она загружается User32.dll , так как процесс зависит от экспортированных функций в этой библиотеке DLL, и обновляет записи в таблице адресов функции. Все вызовы CreateWindow вызывают функцию, экспортируемую из User32.dll.

Дополнительные сведения см. в статье "Связывание исполняемого файла с библиотекой DLL".