LIB DLL tutotial
.pdfМоя коллекция
Данный документ предоставляется «как есть». Информация и мнения, выраженные в данном документе, включая URL-адреса и другие ссылки на вебсайты, могут изменяться без предварительного уведомления. Данный документ не предоставляет вам какие-либо права на интеллектуальную собственность в продуктах Майкрософт или имени продукта. Копирование и использование данного документа допускаются только для внутренних справочных целей. Можно изменять данный документ для внутренних справочных целей. © Корпорация Майкрософт ﴾Microsoft.﴿, 2011. Все права защищены. Условия использования ﴾http://msdn.microsoft.com/cc300389.aspx﴿ | Товарные знаки
(http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx)
Table Of Contents
Глава 1
Пошаговое руководство. Создание и использование статической библиотеки ﴾C++﴿ Пошаговое руководство. Создание и использование библиотеки DLL ﴾C++﴿
Глава 1
Пошаговое руководство. Создание и использование статической библиотеки ﴾C++﴿
Visual Studio 2013
Вэтом пошаговом руководстве описывается создание библиотеки статической компоновки ﴾LIB-файл﴿ для использования с приложениями на C++. Статические библиотеки являются хорошим способом повторного использования кода. Вместо того чтобы каждый раз реализовывать одни и те же подпрограммы для обеспечения той или иной функциональности в каждом создаваемом приложении, их можно создать единожды и затем вызывать из приложений. Код, подключенный из статической библиотеки, становится частью вашего приложения — для использования кода не нужно устанавливать еще какой-либо файл.
Вэтом пошаговом руководстве рассматриваются следующие задачи:
Создание проекта статической библиотеки Добавление класса в статическую библиотеку
Создание консольного приложения, ссылающегося на статическую библиотеку Использование функциональности из статической библиотеки в приложении Запуск приложения
Обязательные компоненты
Для работы необходимо владеть основами языка C++.
Создание проекта статической библиотеки
1.В строке меню Файл выберите пункты Создать, Проект.
2.В левой области диалогового окна Новый проект разверните Установленные, Шаблоны, Visual C++ и затем выберите Win32.
3.В центральной области выберите Консольное приложение Win32.
4.Укажите имя для проекта — например, MathFuncsLib — в поле Имя. Укажите имя для решения — например, DynamicLibrary — в поле Имя решения. Нажмите кнопку ОК.
5.На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее.
6.На странице Параметры приложения в разделе Тип приложения выберите Статическая библиотека.
7.На странице Параметры приложения в разделе Дополнительные параметры снимите флажок Предкомпилированный заголовок.
8.Нажмите кнопку Готово, чтобы создать проект.
Добавление класса в статическую библиотеку
1.Для создания файла заголовка для нового класса откройте контекстное меню для проекта MathFuncsLib, а затем в поле Обозреватель решений выберите Добавить, Создать элемент. В диалоговом окне Добавить новый элемент в левой области в разделе Visual C++ выберите Код. В центральной области выберите Заголовочный файл ﴾.h﴿. Укажите имя для заголовка файла, например MathFuncsLib.h, и нажмите кнопку Добавить. Отобразится пустой файл заголовка.
2.Добавьте класс с именем MyMathFuncs, осуществляющий обычные арифметические операции, такие как сложение, вычитание, умножение и деление. Код должен выглядеть примерно следующим образом:
C++
// MathFuncsLib.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a - b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
static double Divide(double a, double b);
};
}
3.Для создания исходного файла для нового класса откройте контекстное меню проекта MathFuncsLib, а затем в поле Обозреватель решений выберите Добавить, Создать элемент. В диалоговом окне Добавить новый элемент в левой области в разделе Visual C++ выберите Код. В центральной области выберите Файл C++ ﴾.cpp﴿. Укажите имя для исходного файла — например, MathFuncsLib.cpp — и нажмите кнопку Добавить. Отобразится пустой исходный файл.
4.Используйте этот исходный файл для реализации функциональности MyMathFuncs. Код должен выглядеть примерно следующим образом:
C++
//MathFuncsLib.cpp
//compile with: cl /c /EHsc MathFuncsLib.cpp
//post-build command: lib MathFuncsLib.obj
#include "MathFuncsLib.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)
{
return a / b;
}
}
5.Скомпилируйте статическую библиотеку, выбрав Собрать решение в меню Сборка. В результате будет создана статическая библиотека, которая может использоваться другими программами.
Примечание
При выполнении сборки из командной строки Visual Studio программа собирается в два этапа. Сначала запустите cl /c /EHsc MathFuncsLib.cpp, чтобы скомпилировать код и создать файл объекта с именем MathFuncsLib.obj. ﴾Команда cl вызывает компилятор Cl.exe, а параметр /c дает указание компилировать без компоновки. Дополнительные сведения см. в разделе Параметр /c ﴾компиляция без связывания﴿.﴿ Во-вторых, запустите файл lib MathFuncsLib.obj, чтобы связать код и создать статическую библиотеку MathFuncsLib.lib. ﴾Команда lib вызывает диспетчер библиотек, Lib.exe. Дополнительные сведения см. в разделе Справочник по LIB.)
Создание консольного приложения C++, ссылающегося на статическую библиотеку
1.В меню Файл выберите пункты Создать, Проект.
2.В левой области в категории Visual C++ выберите Win32.
3.В центральной области выберите Консольное приложение Win32.
4.Укажите имя проекта — например, MyExecRefsLib — в поле Имя. В раскрывающемся списке рядом с полем Решение выберите Добавить в решение. В результате новый проект будет добавлен в решение, содержащее статическую библиотеку. Нажмите кнопку ОК.
5.На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее.
6.На странице Параметры приложения выберите в поле Тип приложения пункт Консольное приложение.
7.На странице Параметры приложения в разделе Дополнительные параметры снимите флажок Предкомпилированный заголовок.
8.Нажмите кнопку Готово, чтобы создать проект.
Использование функциональности из статической библиотеки в приложении
1.После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MyExecRefsLib.cpp.
2.Для использования математических процедур из статической библиотеки необходимо сослаться на эту библиотеку. Для этого откройте контекстное меню проекта MyExecRefsLib в области Обозреватель решений и выберите Ссылки. В диалоговом окне Страницы свойств MyExecRefsLib разверните узел Общие свойства, выберите .NET Framework и ссылки и нажмите кнопку Добавить новую ссылку. Дополнительные сведения о диалоговом окне Ссылки см. в разделе Среда и ссылки, общие свойства и диалоговое окно "Страницы свойств: <Имя проекта>".
3.В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проекты перечислены все проекты текущего решения и включенные в них библиотеки, если они есть. Установите флажок рядом с MathFuncsLib на вкладке Проекты, а затем нажмите кнопку
ОК.
4.Для создания ссылки на файл заголовка MathFuncsLib.h необходимо изменить путь к каталогам включения. Для этого в диалоговом окне Окна свойств библиотеки MyExecRefsLib последовательно разверните узлы Свойства конфигурации, C/C++, а затем выберите Общие. В поле Дополнительные каталоги включаемых файлов укажите путь к каталогу MathFuncsLib или найдите этот каталог.
Чтобы найти путь к каталогу, откройте раскрывающийся список значений свойства и выберите Изменить. В текстовом поле диалогового окна Дополнительные каталоги включаемых файлов выберите пустую строку и нажмите кнопку с многоточием ﴾…﴿ в конце строки. В диалоговом окне Выбор каталога выберите каталог MathFuncsLib и нажмите кнопку Выбор папки, чтобы сохранить выбранное значение и закрыть диалоговое окно. В диалоговом окне Дополнительные каталоги включаемых файлов, нажмите кнопку ОК, затем в диалоговом окне Окна свойств нажмите кнопку ОК для сохранения изменений в проект.
5.Теперь класс MyMathFuncs можно использовать в приложении. Для этого замените содержимое файла MyExecRefsLib.cpp следующим кодом:
C++
//MyExecRefsLib.cpp
//compile with: cl /EHsc MyExecRefsLib.cpp /link MathFuncsLib.lib
#include <iostream>
#include "MathFuncsLib.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;
return 0;
}
6. Соберите исполняемый файл, выбрав команду Собрать решение в меню Сборка.
Запуск приложения
1.Убедитесь, что проект MyExecRefsLib выбран в качестве проекта по умолчанию, открыв контекстное меню для MyExecRefsLib в разделе Обозреватель решений и выбрав Назначить запускаемым проектом.
2.Чтобы запустить проект, в строке меню выберите Отладка, Запуск без отладки. Результат выполнения должен выглядеть примерно следующим образом:
a + b = 106,4
a - b = -91,6
a * b = 732,6
a / b = 0,0747475
См. также
Задачи
Интерактивный учебник по Visual C++
Пошаговое руководство. Создание и использование библиотеки DLL ﴾C++﴿
Основные понятия
Приложения Win32 для настольных систем ﴾Visual C++﴿
© 2014 Microsoft. Все права защищены.
Пошаговое руководство. Создание и использование библиотеки DLL ﴾C++﴿
Visual Studio 2013
Вэтом пошаговом руководстве описывается создание библиотеки динамической компоновки ﴾DLL﴿ для использования с C++ приложением. Использование библиотеки — хороший способ повторного использования кода. Вместо повторной реализации одних и тех же процедур в каждой программе, вы создаете их один раз и затем ссылаетесь на них из других приложений. Поместив код в библиотеке DLL, вы сэкономите место в каждом приложении, которое ссылается на этод код, а так же сможете обновлять DLL без перекомпиляции всех приложений. Дополнительные сведения о библиотеках DLL см. в разделе DLL в Visual C++.
Вэтом пошаговом руководстве рассматриваются следующие задачи:
Создание проекта DLL.
Добавьте класс в DLL.
Создание консольного приложения, использующего динамическую компоновку времени загрузки для ссылки на библиотеку DLL.
Использование функциональности из класса в приложении.
Запуск приложения.
В этом пошаговом руководстве будет создана библиотека DLL, которая может вызываться только из приложений, использующих соглашения о вызове C++. Сведения о создании DLL-файлов для использования с другими языками см. в разделе Вызов функций библиотек DLL из приложений Visual Basic.
Обязательные компоненты
Этот раздел предполагает знание основ языка C++.
Создание проекта библиотеки динамической компоновки (DLL)
1.В меню Файл выберите Создать, Проект.
2.В левой области диалогового окна Новый проект разверните Установленные, Шаблоны, Visual C++ и затем выберите Win32.
3.В центральной области выберите Консольное приложение Win32.
4.Укажите имя для проекта — например, MathFuncsDll — в поле Имя. Укажите имя для решения — например, DynamicLibrary — в поле Имя решения. Нажмите кнопку ОК.
5.На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее.
6.На странице Параметры приложения в разделе Тип приложения выберите DLL.
7.Нажмите кнопку Готово, чтобы создать проект.
Добавление класса в библиотеку динамической компоновки
1.Чтобы создать файл заголовка для нового класса, в меню Проект выберите Добавить новый элемент. В диалоговом окне Добавить новый элемент в левой области в разделе Visual C++ выберите Код. В центральной области выберите Файл заголовка ﴾.h﴿. Укажите имя для заголовка файла, например MathFuncsDll.h, и нажмите кнопку Добавить. Отобразится пустой файл заголовка.
2.Добавьте следующий код в начало файла заголовка:
C++
// MathFuncsDll.h
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport) #endif
3.Добавьте простой класс с именем MyMathFuncs для выполнения обычных арифметических операций, таких как сложение, вычитание, умножение и деление. Код должен выглядеть примерно следующим образом:
C++
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.
4.В проекте MathFuncsDll в Обозревателе решений в папке Исходные файлы откройте файл MathFuncsDll.cpp.
5.Реализуйте функциональность класса MyMathFuncs в исходном файле. Код должен выглядеть примерно следующим образом:
C++
// 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;
}
}
6. Скомпилируйте библиотеку динамической компоновки, выбрав Собрать решение в меню Сборка.
Примечание
При использовании выпуска Express, где не отображается меню Сборка в строке меню выберите Сервис, Параметры, Экспертные параметры, чтобы включить его, а затем выберите Сборка, Собрать решение.
Примечание
При сборке проекта из командной строки используйте параметр компилятора /LD, указывающий на то, что выходной файл должен являться DLL-файлом. Для получения дополнительной информации см. /MD, /MT, /LD ﴾использование библиотеки времени выполнения﴿. Используйте параметр компилятора /EHsc для включения обработки исключений С++. Для получения дополнительной информации см. Параметр /EH ﴾модель обработки исключений﴿.
Создание приложения, ссылающегося на DLL
1.Чтобы создать приложение С++, которое будет ссылаться и использовать созданную ранее в строке меню библиотеку DLL, в меню Файл выберите пункт
Создать и затем пункт Проект.
2.В левой области в категории Visual C++ выберите Win32.
3.В центральной области выберите Консольное приложение Win32.
4.Укажите имя для проекта — например, MyExecRefsDll — в поле Имя. В раскрывающемся списке рядом с полем Решение выберите Добавить в решение. В результате новый проект будет добавлен в то же решение, содержащее DLL. Нажмите кнопку ОК.
5.На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее.
6.На странице Параметры приложения в разделе Тип приложения выберите Консольное приложение.
7.На странице Параметры приложения в разделе Дополнительные параметры снимите флажок Предкомпилированный заголовок.
8.Нажмите кнопку Готово, чтобы создать проект.
Использование функциональности из библиотеки классов в приложении
1.После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MyExecRefsDll.cpp.
2.Для использования в приложении математических процедур, созданных в библиотеке DLL, необходимо сослаться на эту библиотеку. Для этого в Обозревателе решений выберите проект MyExecRefsDll, затем в меню Проект выберите Ссылки. В диалоговом окне Страницы свойств разверните узел Общие свойства, выберите .NET Framework и ссылки и нажмите кнопку Добавить новую ссылку. Дополнительные сведения о диалоговом окне Ссылки см. в разделе Среда и ссылки, общие свойства и диалоговое окно "Страницы свойств: <Имя проекта>".
3.В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проект перечислены все проекты текущего решения и включенные в них библиотеки, если они есть. Установите флажок рядом с MathFuncsDll на вкладке Проекты, а затем нажмите кнопку
ОК.
4.Для создания ссылки на файлы заголовков DLL необходимо изменить путь к каталогам включения. Для этого в диалоговом окне Окна свойств
последовательно разверните узлы Свойства конфигурации, C/C++, а затем выберите Общие. В поле Дополнительные каталоги включаемых файлов
укажите путь к месту размещения файла заголовков MathFuncsDll.h. Можно использовать относительный путь, например ..\MathFuncsDll\, затем нажмите кнопку ОК.
5.Теперь класс MyMathFuncs можно использовать в приложении. Замените код в файле MyExecRefsDll.cpp следующим кодом:
C++
//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;
}