LABA5_PROG
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Лабораторная работа №5
«Классы в С++, использование dll библиотек»
Выполнил:
студент группы БРТ2102
Епифанов Георгий
Проверил:
Кандауров Николай
Москва 2023
Задание
Создать динамическую библиотеку (dll) с 1 радиотехническим
устройством для среды имитационного моделирования Спектр-2.
Устройство должно быть во временной (действительной) области.
Проверить работоспособность.
ВАР-6, 2 входа 1 выход, перемножитель
Листинг программы:
.cpp
#include "try500.h"
using namespace Spectr2;
#define DEVS_MAX 1 //!< Текущее значение количества устройств в библиотеке
#define _CRT_SECURE_NO_WARNINGS 1
// Глобальные переменные
HINSTANCE hInst; // дескриптор модуля
LPSYSPARAM sysp; // Указатель на параметры системы
// Входная точка библиотеки. Вызывается Windows'ом
//#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
hInst = hDLL; // Запомним наш дескриптор.
// Сюда вставляется Ваш код инициализации библиотеки,
// если, конечно, он Вам необходим
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
// Вызов библиотечной функции для освобождения ресурсов.
// Сюда вставляется Ваш код деинициализации библиотеки,
// если, конечно, он Вам необходим
break;
}
return TRUE;
}
DWORD __stdcall
devGetDllInfo(char* info)
{
strcpy(info, "LABA5");
return DEVS_MAX; // Библиотека содержит DEVS_MAX устройств
}
DWORD __stdcall
devGetDevices(int n0, // Индекс первого устройства (получаем от основной программы)
LPSYSPARAM _sysp,// Указатель на параметры системы (они общие для всех библиотек)
SA_PROC* saproc, // Указатель на основной массив процедур устройств
HIMAGELIST himl // Набор иконок всех устрйоств
)
{
// Вызов функции инициализации базовых устройств
lpDeviceBase* devs = init_base_device(n0, DEVS_MAX, saproc);
sysp = _sysp; // Запомним указатель полученными данными
// Заполняем массив указателей на базовые устройства через указатели на
// производные классы.
devs[0] = new MultiplicationDev;
return 1;
}
void __stdcall tact_multiplication(LPDEVPROP dp)//Тактовая функция
{
LPMultiplicationPARAM lpp = static_cast<LPMultiplicationPARAM> (dp->lpp);
*dp->pins[4].f_out = dp->pins[1].f_in * dp->pins[2].f_in;
}
.h
#pragma once
#include <spectr2/basedevice.h>
#include <user_dev.h>
#define _CRT_SECURE_NO_WARNINGS 1
extern HINSTANCE hInst; // Дескриптор модуля необходим для вызова диалогов
extern LPSYSPARAM sysp; // Указатель на параметры системы
void __stdcall tact_multiplication(LPDEVPROP);//Тактовая функция
namespace Spectr2 {
//! Структура параметров
struct MultiplicationPARAM
{
float a;
};
typedef MultiplicationPARAM* LPMultiplicationPARAM; //!< Указатель
//! Рабочая структура
struct MultiplicationWORK
{
};
typedef MultiplicationWORK* LPMultiplicationWORK; //!< Указатель
//! Производный класс для устройства
class MultiplicationDev : public DeviceBase
{
public:
//! Функция инициализации
virtual DWORD init(HWND hwnd)
{
LPMultiplicationPARAM mp = static_cast<LPMultiplicationPARAM>(init_device(sizeof(MultiplicationPARAM), 2, 1));
mp->a = 1;
return 1;
}
//! Функция старта
virtual DWORD start(DWORD pin)
{
if (!get_work_ptr()) {
LPMultiplicationPARAM mp = static_cast<LPMultiplicationPARAM>(get_data_ptr()); //параметры модулятора
mp->a = 1;
//set_work_ptr(aw); // установить рабочую структура
set_tact_proc(tact_multiplication);// иницаилизация тактовой процедуры
}
return 1;
}
//! Функция стоп
virtual void stop(HWND hwnd)
{
}
//Имя кубика, которое отображается в дереве слева.
virtual void get_name(char* name) { set_name(name, "try500_dll"); }
//!Установка типа кубика(где он будет лежать) Действительный (временной) тракт, Прочие
virtual DWORD get_type() { return (DBDEV_ROOT_TIME | DBDEV_TIME_OTHER); }
//! Инициализация пинов(ножек) 1 входной и 1 выходной пин,(номер, тип, название)
virtual void init_pins(LPDEVPIN in, LPDEVPIN out)
{
init_pin(in[1], SADF_TIME, "Вход", "Отсчеты", 2);
init_pin(in[2], SADF_TIME, "Вход", "Отсчеты", 2);
init_pin(out[1], SADF_TIME, "Выход", 0, 2);
}
//! Правой кнопкой по кубику и выбрать справка. Будет окно с текстом.
virtual void help(HWND hwnd)
{
MessageBox(hwnd, "LABA5",
"_", MB_OK | MB_ICONINFORMATION);
}
};
}
.def
LIBRARY try500
EXPORTS
devGetDllInfo
devGetDevices
подал на вход два постоянных сигнала амплитудой 5 и 3 получил на выходе осцилографа: