ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

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

Начало тут:
1. динамически подключаемые библиотеки;
2. о динамически подключаемых библиотеках подробнее;
3. преимущества динамического связывания.

Перевод с английского статьи от 31.05.2018 г. «Dynamic-Link Library Creation»:
https://docs.microsoft.com/ru-ru/windows/win32/dlls/dynamic-link-library-creation
(На данный момент на этом сайте нет перевода этой статьи на русский, есть только версия на английском.)

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

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

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

Если есть вероятность, что наша DLL будет использоваться многопоточным приложением, мы должны сделать нашу DLL потокобезопасной. Для этого мы должны синхронизировать доступ ко всем глобальным данным DLL, чтобы избежать повреждения данных. Кроме того, для этого необходимо добиться, чтобы другие библиотеки, используемые при компоновке нашей, тоже были бы потокобезопасными. Например, среда «Microsoft Visual C++» содержит множество версий библиотеки времени выполнения для языка Си [C Run-time Library], одни из которых не потокобезопасные, другие — потокобезопасные [подробнее].

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

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

Например, в среде «Microsoft Visual C++» есть два способа обозначить функции DLL экспортируемыми: с помощью конструкции из ключевых слов __declspec(dllexport) или с помощью текстового файла с указаниями компоновщику .def [module-definition (.def) file]. Если мы используем конструкцию из ключевых слов __declspec(dllexport), то необходимость в файле .def отпадает. Подробнее смотрите в статье «Экспортирование из DLL».

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

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

Подробнее смотрите в статье «Сборка библиотеки импорта и файла экспорта».

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

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

Подробнее смотрите в статье «Неявное связывание» [статья устарела] или «Связывание исполняемого файла с библиотекой DLL».
Tags: Английский язык, Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments