ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.06.2019
Просмотров: 110
Скачиваний: 1
Лабораторная работа № 10
Студента ИТ 14-1 Красовского Абхая
Создание и использование динамически компонуемых библиотек функций
Вариант №9
Цель: Получить навыки в следующих предметных областях:
-
создание динамически компонуемых библиотек функций (Dynamic Link-Library);
-
загрузка динамически компонуемых библиотек и вызов их функций с использованием функций WinAPI
Индивидуальное задание
Включить в состав приложения, разработанного в предыдущих лабораторных работах, библиотеку DLL, куда включить функцию по расчету координат точек кривой, полученной в качестве индивидуального задания. Обеспечить загрузку библиотеки и вызов такой функции.
Код программы:
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
void main()
{
setlocale(LC_ALL, "rus");
HMODULE hDLL;
double (*fx)(double, double), (*fy)(double, double);
if (hDLL = LoadLibrary("DLL.dll"))
cout << "Библиотека загружена" << endl;
fx = (double (*) (double, double))GetProcAddress(hDLL, "fx");
fy = (double (*) (double, double))GetProcAddress(hDLL, "fy");
cout << "x = " << fx(10, 10) << endl;
cout << "y = " << fy(15, 10) << endl;
if (FreeLibrary(hDLL)) cout << "Библиотека выгружена" << endl;
_getch();
}
Код DLL:
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
#include <windows.h>
#include <math.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" _declspec(dllexport) double x = 0; // модификатор extern "C" указывает, что функция или переменная должна иметь имя в стиле языка С
extern "C" _declspec(dllexport) double y = 0; // модификатор _declspec(dllexport) указывает, что функция ии переменная будет экспортироватся из DLL
extern "C" _declspec(dllexport) double fx(double a, double t)
{
x = 2 * a * cos(t) - a * cos(2 * t);
return x;
}
extern "C" _declspec(dllexport) double fy(double a, double t)
{
y = 2 * a * sin(t) - a * sin(2 * t);
return y;
}
Результат: