Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LABA5_PROG

.docx
Скачиваний:
4
Добавлен:
27.05.2023
Размер:
37.33 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Лабораторная работа №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 получил на выходе осцилографа:

Соседние файлы в предмете Программирование на C++