Zireael |
Отправлено: 13 Декабря, 2023 - 02:02:46
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А зачем тут вообще С++, кибор считать разучился?
Скорее всего, дело не в этом. Функционал кибор ограничен, сделать можно много чего, но не всё, также не всегда удобно из-за ограниченности синтаксиса. Какую-то часть кода удобнее выполнить в длл. При работе с большим объёмом данных или каких-то вычислениях тоже нужна длл. Если скрипт большой, то часть кода лучше перенести в длл, т. к. потребление памяти в кибор не самое эффективное.
Данный пример больше нужен для изучения и понимания какой код должен быть в длл, как передавать параметры, получить результат.
sedoi, Устанавливайте Visual Studio 2022 Community, при установке выбрать галку 'Разработка классических приложений на C++', Пошаговое руководство. Создание и использование собственной библиотеки динамических ссылок (C++) |
|
|
sedoi |
Отправлено: 13 Декабря, 2023 - 11:09:46
|
Наблюдатель
Покинул форум
Сообщений всего: 47
Дата рег-ции: Апр. 2016
Репутация: 1
|
Zireael пишет: А зачем передавать параметры строкой и потом разбирать её?
Так не проще?:
C++ (Отобразить)CODE:#include "pch.h"
#include <iostream>
using namespace std;
double M_PI = 3.1415926535;
extern "C" __declspec(dllexport) int Get_Angle(int x1, int y1, int x2, int y2, int azimuth)
{
// Вычисляем азимут в радианах
double azimuth_rad = azimuth * M_PI / 180.0;
// Вычисляем угол между вектором и азимутом
int dx = x2 - x1;
int dy = y2 - y1;
int angle_rad = atan2(dy, dx) - azimuth_rad;
// Преобразуем угол в градусы
int angle_deg = angle_rad * 180.0 / M_PI;
// Приводим угол к диапазону от -180 до 180 градусов
if (angle_deg > 180.0) angle_deg -= 360.0;
else if (angle_deg < -180.0) angle_deg += 360.0;
// это можно удалить
char buf[999];
snprintf(buf, sizeof(buf), "%d%c %d%c %d%c %d%c %d", x1, ',', y1, ',', x2, ',', y2, ',', azimuth);
MessageBoxA(0, buf, "Kibor", MB_OK);
/////
return angle_deg;
}
Kibor (Отобразить)CODE:external(INT, "Get_Angle", "Get_Angle", "MyDllKib.dll");
int result = Get_Angle(100, 200, 300, 400, 350);
messagebox(result);
Добрый человек, объясни мне не далёкому что это за параметры и откуда они берутся?
external(INT, "Get_Angle", "Get_Angle", "MyDllKib.dll" первый параметр я так понял означает что что то мы получим целочисленное, 2й параметр я так понял что это название функции которую мы будем вызывать с параметрами, 3й остаётся под вопросом, 4й параметр это название самой функции, я правильно рассуждаю? если да то откуда мы берём 3й параметр в external? |
|
|
Zireael |
Отправлено: 13 Декабря, 2023 - 11:20:41
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Первый параметр INT DOUBLE STRING CHAR VOID. Что возвращает функция. VOID говорит о том что функция не возвращает ничего.
Второй - символическое имя по которомы мы будем юзать эту функцию в скрипте.
Третий - Оригинальное название функции в библиотеке
Четвертый - подключаемая библиотека.
CODE:external(INT, "Func", "Get_Angle", "MyDllKib.dll");
int result = Func(100, 200, 300, 400, 350);
messagebox(result); |
|
|
sedoi |
Отправлено: 13 Декабря, 2023 - 11:34:46
|
Наблюдатель
Покинул форум
Сообщений всего: 47
Дата рег-ции: Апр. 2016
Репутация: 1
|
Zireael пишет: Цитата: Первый параметр INT DOUBLE STRING CHAR VOID. Что возвращает функция. VOID говорит о том что функция не возвращает ничего.
Второй - символическое имя по которомы мы будем юзать эту функцию в скрипте.
Третий - Оригинальное название функции в библиотеке
Четвертый - подключаемая библиотека.
CODE:external(INT, "Func", "Get_Angle", "MyDllKib.dll");
int result = Func(100, 200, 300, 400, 350);
messagebox(result);
Сама MyDllKib.dll должна лежать в папке кибор если к примеру я сейчас хочу её про тестить? |
|
|
sedoi |
Отправлено: 13 Декабря, 2023 - 11:45:57
|
Наблюдатель
Покинул форум
Сообщений всего: 47
Дата рег-ции: Апр. 2016
Репутация: 1
|
Kibor пишет: sedoi пишет: Сама MyDllKib.dll должна лежать в папке кибор если к примеру я сейчас хочу её про тестить?
В данном случае да.
Или можете указать полный путь к папке другой.
4й параметр можно вот так добавить?
external(INT, "Get_Angle", "Get_Angle", "D:\Kibor\MyDllKib.dll" |
|
|
|