Создание библиотек DLL, содержащих только ресурсы
В библиотеке DLL, содержащей только ресурсы, нет ничего, кроме ресурсов, таких как значки, растровые изображения, строки и диалоговые окна. Библиотеки DLL, содержащие только ресурсы, удобно использовать, когда необходимо предоставить нескольким программам общий доступ к одному и тому же набору ресурсов. С их помощью можно также легко предоставлять приложение с ресурсами, локализованными для нескольких языков. Дополнительные сведения см. в разделе «Локализованные ресурсы» в приложениях MFC: вспомогательные библиотеки DLL.
Создание библиотеки DLL, содержащей только ресурсы
Чтобы создать библиотеку DLL, содержащую только ресурсы, создайте новый проект Windows DLL (не MFC) и добавьте в него свои ресурсы.
- Выберите Проект Win32 в диалоговом окне Создание проекта. Введите имена проекта и решения, а затем нажмите кнопку ОК.
- В мастере приложений Win32 выберите Параметры приложения. В качестве типа приложения выберите DLL. В поле Дополнительные параметрывыберите Пустой проект. Нажмите кнопку Готово, чтобы создать проект.
- Создайте новый скрипт ресурсов, содержащий ресурсы для этой библиотеки DLL (такие как строка или меню). Сохраните файл .rc .
- В меню Проект выберите Добавить существующий элемент, а затем вставьте в проект новый файл .rc .
- Укажите параметр компоновщика /NOENTRY. Параметр /NOENTRY запрещает компоновщику привязывать ссылку на _main к библиотеке DLL, поэтому его необходимо указывать при создании библиотеки DLL, содержащей только ресурсы.
- Построение библиотеки DLL.
- В диалоговом окне Создание проекта выберите Мастер классических приложений Windows и нажмите кнопку Далее. На странице Настройка нового проекта введите имена проекта и решения, а затем нажмите кнопку Создать.
- В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Библиотека динамической компоновки. В поле Дополнительные параметрывыберите Пустой проект. Нажмите кнопку ОК, чтобы создать проект.
- Создайте новый скрипт ресурсов, содержащий ресурсы для этой библиотеки DLL (такие как строка или меню). Сохраните файл .rc .
- В меню Проект выберите Добавить существующий элемент, а затем вставьте в проект новый файл .rc .
- Укажите параметр компоновщика /NOENTRY. Параметр /NOENTRY запрещает компоновщику привязывать ссылку на _main к библиотеке DLL, поэтому его необходимо указывать при создании библиотеки DLL, содержащей только ресурсы.
- Построение библиотеки DLL.
Использование библиотеки DLL, содержащей только ресурсы
Приложение, которое использует библиотеку DLL, содержащую только ресурсы, должно вызывать LoadLibraryEx или связанную функцию, чтобы явно привязать эту библиотеку DLL. Для доступа к ресурсам следует вызывать универсальные функции FindResource и LoadResource , которые работают с ресурсами любого типа. Для доступа к конкретному ресурсу можно также использовать вызов одной из следующих функций:
- FormatMessage
- LoadAccelerators
- LoadBitmap
- LoadCursor
- LoadIcon
- LoadMenu
- LoadString
Завершив использование ресурсов, приложение должно вызывать FreeLibrary .
создание DLL на языке C
Как создать динамическую библиотеку на языке C и подключить ее к проекту на языке C с помощью компилятора Cygwin/gcc в командной строке? Так я сделал и подключил (код ниже) с префиксом lib и расширением .so, а вот как с расширением .dll, подскажите. Спасибо. sum.c
#include "sum.h" int f1(int a, int b)
sum.h
int f1(int, int);
main.c
#include #include "sum.h" int main(void)
создание динамической библиотеки
gcc -shared sum.c -o libsum.so
компиляция проекта с динамической библиотекой
gcc main.c -o abc.exe -L . libsum.so
Создание библиотеки DLL на C++
В этой заметке рассказывается как создать простую DLL-библиотеку, а затем – подключить ее к своей программе. Запускаем Visual Studio и создаём проект библиотеки DLL, назовём его myDLL. Добавляем в проект новый файл myDLL.h , поместим в него следующий код:
#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;
Теперь найдём в проекте файл myDLL.cpp и заменим его код следующим:
#include «stdafx.h» #include «myDll.h» #include using namespace std; int MyDLL::testSumma(int a, int b)
Библиотека из одной функции готова, но вы можете добавить туда другие функции. Попробуем использовать эту библиотеку в другом проекте. В Visual Studio создайте консольное приложение testMyDLL, снимите флажочек Precompiled header . Для использования в приложении функций, созданных в библиотеке DLL, необходимо сослаться на эту библиотеку. В свойствах проекта выберите Common Properties->References , добавьте новую ссылку на myDLL, нажав кнопку “Add New Reference…”. Не забудьте прописать путь к файлу myDLL.h из предыдущего проекта библиотеки DLL. Замените кода файла testMyDLL.cpp следующим:
#include #include «myDll.h» using namespace std; int main()
Запускаем приложение testMyDLL и смотрим результат:
a = 5, b = 10 a + b = 15
06.08.2023 в 17:18 #8999
Без Visual Studio тоже можно собрать. Исходный код библиотеки ( my_dll.h ):
#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;
Исходный код библиотеки ( my_dll.cpp ):
#include «my_dll.h» using namespace std; int MyDLL::testSumma(int a, int b)
Собрать библиотеку можно такой командой:
gcc -shared -o my.dll my_dll.cpp -Wl,—output-def,my_dll.def,—out-implib,my_dll.a На выходе помимо dll-файла формируется .a и .def файлы. Чтобы использовать библиотеку, копируем .dll и .h файлы в каталог проекта и собираем его так: g++ main.cpp -o main.exe -L. -lmy
Опция -lmy приводит к подключению к проекту библиотеки my.dll.
Создание библиотек 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 Classes (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 и поведение библиотеки времени выполнения Visual C++
Описывается последовательность запуска библиотеки DLL средой выполнения.
Функции LoadLibrary и AfxLoadLibrary
Описывается использование функций LoadLibrary и AfxLoadLibrary для явной связи с библиотекой DLL во время выполнения.
Функция GetProcAddress
Описывается использование GetProcAddress для получения адреса экспортированной функции в DLL.
Функции FreeLibrary и AfxFreeLibrary
Описывается использование функций FreeLibrary и AfxFreeLibrary , когда модуль DLL больше не нужен.
Порядок поиска библиотеки динамической компоновки (DLL)
Описание пути поиска, который операционная система Windows использует для поиска библиотеки DLL в системе.
Состояния модулей обычной библиотеки DLL MFC, динамически связанной с MFC
Описываются состояния модулей обычной библиотеки DLL, динамически связываемой с MFC.
Библиотеки DLL для расширения MFC
Описываются библиотеки DLL, которые обычно реализуют классы многократного использования, производные от существующих классов MFC.
Создание библиотек DLL, содержащих только ресурсы
Библиотека DLL, содержащая только ресурсы, например значки, растровые изображения, строки и диалоговые окна.
Локализованные ресурсы в приложениях MFC: вспомогательные библиотеки DLL
Расширенная поддержка библиотек спутниковой связи DLL и содержит возможность, которая позволяет создавать приложения, локализированные на различные языки.
Импорт и экспорт
Импортирование открытых символов в приложение или экспортирование функций из библиотеки DLL
Технология Active и библиотеки DLL
Размещение серверов объектов внутри библиотеки DLL.
Автоматизация в библиотеке DLL
Параметр автоматизации в решениях мастера библиотек DLL MFC.
Соглашения об именовании библиотек DLL MFC
Способ встраивания библиотек DLL в MFC, опираясь на четко структурированное соглашение об именовании.
Связанные разделы
Использование MFC как части библиотеки DLL
Описываются постоянные библиотеки DLL MFC, которые позволяют использовать библиотеку MFC как часть библиотеки динамической компоновки Windows.
Версия библиотеки DLL MFC
Описывается механизм использования общих библиотек динамической компоновки MFCxx.dll и MFCxxD.dll (где x является номером версии MFC) с приложениями MFC и расширениями библиотек DLL MFC.
Обратная связь
Были ли сведения на этой странице полезными?