Пошаговое руководство. Создание и использование библиотеки DLL (C++)
В этом пошаговом руководстве описывается создание библиотеки динамической компоновки (DLL) (DLL) для использования с приложением A.C на C-++.Использование библиотеки являются хорошим способом повторного использования кода.Вместо повторной реализации те же процедуры в каждой программе, созданной им создается один раз и затем ссылки на них из приложений, требующих функции.Поместив кода в библиотеке DLL, сохранении пробел в каждом приложении, ссылки, и его можно обновить DLL без перекомпиляции всего приложения.Дополнительные сведения о библиотеках DLL см. в разделе Библиотека DLL в Visual C++.
В этом пошаговом руководстве рассматриваются следующие задачи.
Создание проекта библиотеки DLL.
Добавление класса в библиотеку DLL.
Создание приложения консоли, использующего динамической компоновкой для ссылки на библиотеки DLL.
Использование функциональных возможностей класса в приложении.
Запуск приложения.
В этом пошаговом руководстве будет создана библиотека DLL, которая может вызываться только из приложений, использующих соглашения о вызове C C-++.Дополнительные сведения о создании библиотеки DLL для использования с другими языками см. в разделе Вызов функций библиотек DLL из приложений Visual Basic.
Обязательные компоненты
Этот раздел предполагает знание основ языка C++.
Создание проекта (DLL) библиотеки динамической компоновки (DLL)
В строке меню выберите Файл, Создать, Проект.
На левой панели диалогового окна Создать проект разверните Установлено, Шаблоны, Visual C++, затем выберите Win32.
В центральной области, выберите Консольное приложение Win32.
Укажите имя для проект- для примера, MathFuncsDll- в поле Имя.Укажите имя для решение- для примера, DynamicLibrary- в поле Имя решения.Нажмите кнопку ОК.
На странице Обзор диалогового окна Мастер приложений Win32, нажмите кнопку Далее.
На странице Параметры приложения в поле Тип приложения, выберите dll.
Нажмите кнопку Готово, чтобы создать проект.
Добавление класса в библиотеку динамической компоновки
Создание файла заголовка для классов, в строке меню выберите Проект, Добавление нового элемента.В диалоговом окне Добавление нового элемента в левой панели выберите Visual C++, выберите Код.В центральной области, выберите Заголовочный файл (.h).Укажите имя для заголовка файл- для MathFuncsDll.h-and примера, а затем нажмите кнопку Добавить.Пустой файл заголовка.
Добавьте следующий код в начало файла заголовка.
// MathFuncsDll.h #ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif
Добавьте базовый класс с именем MyMathFuncs для выполнения общих математические операции, такие как сложение, вычитание, умножение и деление.Код должен выглядеть следующим образом:
namespace MathFuncs { // This class is exported from the MathFuncsDll.dll class MyMathFuncs { public: // Returns a + b static MATHFUNCSDLL_API double Add(double a, double b); // Returns a - b static MATHFUNCSDLL_API double Subtract(double a, double b); // Returns a * b static MATHFUNCSDLL_API double Multiply(double a, double b); // Returns a / b // Throws const std::invalid_argument& if b is 0 static MATHFUNCSDLL_API double Divide(double a, double b); }; }
Когда символ MATHFUNCSDLL_EXPORTS определен, символ MATHFUNCSDLL_API установит модификатор __declspec(dllexport) в объявлениях функции-члена в этом коде.Этот модификатор позволяет функции должны экспортироваться DLL таким образом, чтобы он мог использоваться другими приложениями.При MATHFUNCSDLL_EXPORTS не указано, MATHFUNCSDLL_API определяет модификатор __declspec(dllimport) в объявлениях функции-члена.Этот модификатор позволяет компилятору оптимизировать импорта функции из библиотеки DLL для использования в других приложениях.По умолчанию MATHFUNCSDLL_EXPORTS определяется при построении проекта MathFuncsDll.Дополнительные сведения см. в разделе dllexport, dllimport.
Примечание При построении проекта библиотеки DLL в командной строке используйте параметр компилятора /D можно определить символ MATHFUNCSDLL_EXPORTS.
В проекте MathFuncsDll в Обозреватель решений в папке Исходные файлы откройте MathFuncsDll.cpp.
Реализуйте функциональность класса MyMathFuncs в исходном файле.Код должен выглядеть следующим образом:
// MathFuncsDll.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) { throw invalid_argument("b cannot be zero!"); } return a / b; } }
Компилировать библиотека динамической компоновки (DLL), выбрав Построение, Построить решение в строке меню.
Примечание Если используется экспресс-выпуск, не отображает меню Построение в строке меню выберите Сервис, Параметры, Расширенные параметры, чтобы включить его, а затем выберите Построение, Построить решение.
Примечание При построении проекта в командной строке используйте параметр компилятора /LD, чтобы указать, что выходной файл будет библиотеки DLL.Дополнительные сведения см. в разделе /MD, /MT, /LD (использование библиотеки времени выполнения).Используйте параметр компилятора /EHsc включать обработку исключений C-++ C.Дополнительные сведения см. в разделе Параметр /EH (модель обработки исключений).
Создание приложения, ссылающегося на библиотеку DLL
Чтобы создать приложение A.C, C-++, ссылающегося на и использование библиотек DLL, созданные в строке меню выберите Файл, Создать, Проект.
В левой панели выберите Visual C++, выберите Win32.
В центральной области, выберите Консольное приложение Win32.
Укажите имя для проект- для примера, MyExecRefsDll- в поле Имя.В пункте Решение выберите Добавить в решение из раскрывающегося списка.После этого новый проект будет добавлен в то же решение, содержащее библиотеки DLL.Нажмите кнопку ОК.
На странице Обзор диалогового окна Мастер приложений Win32, нажмите кнопку Далее.
На странице Параметры приложения в поле Тип приложения, выберите Консольное приложение.
На странице Параметры приложения в поле Дополнительные параметры, снимите флажок предкомпилированный заголовок.
Нажмите кнопку Готово, чтобы создать проект.
Использование функциональных возможностей библиотеки классов в приложении
После создания приложения консоли создается пустая программа.Имя файла источника совпадает с именем, которое было выбрано ранее.В этом примере он имеет имя MyExecRefsDll.cpp.
Для использования в приложении математических процедур созданных в библиотеку DLL, необходимо ссылаться на него.Чтобы сделать это, выделяет проект MyExecRefsDll, а затем в поле Обозреватель решений в строке меню выберите Проект, Ссылки.В диалоговом окне Страницы свойств разверните узел Общие свойства, выберите .NET Framework и ссылки и затем нажмите кнопку Добавить новую ссылку.Дополнительные сведения о диалоговом окне Ссылки см. в разделе Среда и ссылки, общие свойства и диалоговое окно "Страницы свойств: <Имя проекта>".
В диалоговом окне Добавить ссылку перечислены библиотек, на которые можно ссылаться.На вкладке Проект перечисляются проекты текущего решения и все библиотеки, что они содержат.На вкладке Проекты выберите флажок рядом с MathFuncsDll, а затем нажмите кнопку ОК.
Для ссылки на файлы заголовков библиотек DLL необходимо изменить включенный путь каталога.Для этого в диалоговом окне Страницы свойств, разверните узел Свойства конфигурации, разверните узел C/C++, а затем выбирает Общие.Рядом с Дополнительные каталоги включаемых файлов укажите путь к местоположению файла заголовков MathFuncsDll.h.Можно использовать относительное путь- для примера. \ \ MathFuncsDll, затем нажмите кнопку ОК.
Теперь класс MyMathFuncs можно использовать в приложении.Замените код в файле MyExecRefsDll.cpp следующим кодом:
// MyExecRefsDll.cpp // compile with: /EHsc /link MathFuncsDll.lib #include <iostream> #include "MathFuncsDll.h" using namespace std; int main() { double a = 7.4; int b = 99; cout << "a + b = " << MathFuncs::MyMathFuncs::Add(a, b) << endl; cout << "a - b = " << MathFuncs::MyMathFuncs::Subtract(a, b) << endl; cout << "a * b = " << MathFuncs::MyMathFuncs::Multiply(a, b) << endl; cout << "a / b = " << MathFuncs::MyMathFuncs::Divide(a, b) << endl; try { cout << "a / 0 = " << MathFuncs::MyMathFuncs::Divide(a, 0) << endl; } catch (const invalid_argument &e) { cout << "Caught exception: " << e.what() << endl; } return 0; }
Создайте исполняемый файл, выбрав Построение, Построить решение в строке меню.
Запуск приложения
Убедитесь, что проект MyExecRefsDll выбран в качестве проекта по умолчанию.В поле Обозреватель решений введите select MyExecRefsDll, а затем в строке меню выберите Проект, Назначить запускаемым проектом.
Чтобы запустить проект, в строке меню выберите Отладка, Запуск без отладки.Результат выполнения должен выглядеть примерно следующим образом:
a + B = 106,4 - a B = -91,6 * a B = 732,6 a и B = 0,0747475 перехваченного исключения: B не может быть равным нулю!
Следующие действия
Назад:Библиотека DLL в Visual C++ | Далее:Практическое руководство. Создание библиотек классов
См. также
Задачи
Walkthrough: Deploying Your Program (C++)
Основные понятия
Вызов функций библиотек DLL из приложений Visual Basic