Создание приложения, ссылающегося на 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 следующим кодом.
// 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;
}
6. Соберите исполняемый файл, выбрав команду Собрать решениев меню Сборка.
Запуск приложения
1. Убедитесь в том, что проект MyExecRefsDll выбран в качестве проекта по умолчанию. В Обозревателе решенийвыберите MyExecRefsDll и затем в меню Проектвыберите Назначить запускаемым проектом.
2. Чтобы запустить проект, в строке меню выберите Отладка, Запуск без отладки. Результат выполнения должен выглядеть примерно следующим образом:
1. a + b = 106,4
2. a - b = -91,6
3. a * b = 732,6
4. a / b = 0,0747475
Перехвачено исключение: b не может быть равно нулю!
Контрольные вопросы
1.Какие способы создания динамических библиотек существуют?
2.Опишите процесс неявного связывания функций в динамической библиотеке.
3.Как осуществляется процесс экспорта, импорта функций в динамическую библиотеку при неявном связывании?
4.Опишите функции, которые используются при явном связывании функций в библиотеке (LoadLibrary, FreeLibrary, GetProcAddress).
5.Как создается .DLL файл для функции Asc2Un?
6.Как в вызывающей программе импортируется функция из динамической библиотеки?
7.Поясните работу программы преобразования файла из кодировки ASCII в кодировку Unicode.