Бөлісу құралы:


Создание библиотек DLL на C и C++ в Visual Studio

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

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

Различия между динамическим и статическим связыванием

При статической компоновке весь код объектов копируется из статической библиотеки в использующие их исполняемые файлы во время сборки. При динамической компоновке включаются только те сведения, которые позволяют Windows найти и загрузить библиотеку DLL, содержащую элемент данных или функцию, во время выполнения. При создании библиотеки DLL также создается библиотека импорта, содержащая эту информацию. При сборке исполняемого файла, который вызывает библиотеку DLL, компоновщик использует экспортированные символы в библиотеке импорта, чтобы сохранить эти сведения для загрузчика Windows. Когда загрузчик загружает библиотеку DLL, она сопоставляется с областью памяти приложения. Для выполнения операций инициализации, необходимых библиотеке DLL, вызывается специальная функция DllMain из библиотеки DLL (если она имеется).

Различия между приложениями и библиотеками DLL

Хотя и библиотеки DLL, и приложения являются исполняемыми модулями, они отличаются некоторыми особенностями. Наиболее очевидное различие заключается в том, что библиотеку DLL нельзя запустить. С точки зрения системы, между приложениями и библиотеками DLL имеется два существенных различия.

  • В системе может одновременно выполняться несколько экземпляров приложения. Экземпляр библиотеки DLL может быть только один.

  • Приложение может загружаться как процесс. Ему могут принадлежать такие компоненты, как стек, потоки выполнения, глобальная память, дескрипторы файлов и очередь сообщений. У библиотеки DLL таких компонентов быть не может.

Преимущества использования библиотек DLL

Динамическая компоновка кода и ресурсов имеет некоторые преимущества над статической.

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

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

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

  • С помощью библиотек DLL можно оказывать послепродажную поддержку. Например, библиотеку DLL драйвера дисплея можно изменить так, чтобы она поддерживала дисплей, который не был доступен на момент предоставления приложения.

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

  • Динамическое связывание упрощает поддержку приложений, написанных на разных языках программирования. Программы, написанные на разных языках программирования, могут вызывать одну и ту же функцию в библиотеке DLL при условии соблюдения соглашения о ее вызове. Программы и функция DLL должны быть совместимы следующим образом: порядок, в котором функция ожидает записи своих аргументов в стек. выполнение очистки стека функцией или приложением; И передаются ли аргументы в регистрах.

  • Динамическое связывание предоставляет механизм для расширения классов библиотеки Microsoft Foundation Class (MFC). На основе существующих классов MFC можно создавать производные классы и помещать их в библиотеку расширения DLL, используемую приложениями MFC.

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

Возможный недостаток использования библиотек DLL заключается в том, что приложения не автономны. Они требуют наличия отдельного модуля DLL, которое должно проверяться в процессе установки.

Дополнительные сведения о создании и использовании библиотек DLL

В приведенных ниже статьях приводятся подробные сведения о создании библиотек DLL на C и C++ в Visual Studio.

Пошаговое руководство. Создание и использование библиотеки DLL (C++)
Описывает создание и использование библиотек DLL при помощи Visual Studio.

Виды библиотек DLL
Предоставляет сведения о различных типах библиотек DLL, которые доступны для сборки.

Часто задаваемые вопросы о библиотеках DLL
Ответы на часто задаваемые вопросы о библиотеках DLL.

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

Инициализация библиотеки DLL
Описывается код инициализации библиотеки DLL, который должен выполняться при загрузке библиотеки DLL.

Библиотеки DLL и поведение библиотеки времени исполнения Microsoft C++
Описывается последовательность запуска библиотеки DLL средой выполнения.

Функции LoadLibrary и AfxLoadLibrary
Описывается использование функций LoadLibrary и AfxLoadLibrary для явной связи с библиотекой DLL во время выполнения.

Функция GetProcAddress
Описывается использование GetProcAddress для получения адреса экспортированной функции в DLL.

FreeLibrary и AfxFreeLibrary
Описывается использование функций FreeLibrary и AfxFreeLibrary, когда модуль DLL больше не нужен.

Порядок поиска библиотеки динамической компоновки (DLL)
Описание пути поиска, который операционная система Windows использует для поиска библиотеки DLL в системе.

Состояния модулей обычной библиотеки DLL MFC, динамически связанной с MFC
Описываются состояния модулей стандартной MFC DLL, динамически связанной с MFC.

Расширяемые DLL MFC
Описываются библиотеки DLL, которые обычно реализуют классы многократного использования, производные от существующих классов MFC.

Создание DLL, содержащей только ресурсы
Обсуждается библиотека DLL, содержащая только ресурсы, например значки, растровые изображения, строки и диалоговые окна.

Локализованные ресурсы в приложениях MFC: спутниковые DLL
Обеспечивает расширенную поддержку спутниковых DLL — функции, которая помогает в создании приложений, локализованных для различных языков.

Импорт и экспорт
Импортирование открытых символов в приложение или экспортирование функций из библиотеки DLL

Технология Active и библиотеки DLL
Позволяет реализовывать серверы объектов внутри библиотеки DLL.

Автоматизация в библиотеке DLL
Описание того, что предоставляет параметр автоматизации в мастере DLL для MFC.

Соглашения об именовании библиотек DLL MFC
Функция, описывающая, как DLL и библиотеки, включенные в MFC, следуют четко структурированному соглашению об именовании.

Вызов функций библиотек DLL из приложений Visual Basic
Способ вызова функций DLL из приложений Visual Basic.

Использование MFC как части библиотеки DLL
Описываются обычные библиотеки DLL MFC, которые позволяют использовать библиотеку MFC как часть динамической библиотеки ссылок Windows.

Версия библиотеки DLL MFC
Определяется, как можно использовать разделяемые библиотеки динамической компоновки MFCxx.dll и MFCxxD.dll (где x - это номер версии MFC) с приложениями MFC и расширениями DLL MFC.