Форум программистов, компьютерный форум, киберфорум
Наши страницы
bedvit
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Длинная арифметика (Bignum arithmetic) c COM-интерфейсом и C API Functions для Excel на библиотеках MPIR. С/С++

Запись от bedvit размещена 26.03.2018 в 22:15
Обновил(-а) bedvit 18.02.2019 в 11:25 (Более наглядный Пример №1)

Проект основан на исходниках (на С++) библиотеки MPIR, Edition 3.0.0.
Полностью написан на С/С++.
Скорость на порядок выше предыдущего решения.
Реализовал два блока в проекте:

1.DLL c COM интерфейсом. Реализованы dual-интерфейсы с Automation-совместимыми типами данных, структур
(поддержка как раннего вывязывания, так и позднего). Ранний предпочтительнее в части скорости (на 50% быстрее).
Реализовано два класса: класс целых чисел с арифметикой (BignumArithmeticInteger) и класс чисел с плавающей точкой (BignumArithmeticFloat). При создании экземпляра класса создается массив из 256 чисел с арифметикой.
К числам можно обращаться по индексам (можно переменной присвоить индекс и работать с переменными, см. пример ниже)
BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память.
BignumArithmeticFloat (Bignum), задается изначально, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер).
Размер чисел ничем не ограничен, кроме вашей оперативки.

Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов)
Регистрация стандартная:
Админ: Regsvr32 "FullName.DLL" !ПОМНИМ! В Win10 регистрация под правами админа: "правая кнопка" - "Пуск" -"Командная строка (администратор)"
Пользователь: Regsvr32 /i /n "FullName.DLL"
Удалить из реестра: Regsvr32 /u "FullName.DLL"

Функции и Примеры использования см. ниже.

2.XLL для Excel с C API функциями. Добавил базовый набор. Будет потребность в дополнительных - добавлю по запросу.
Для функций создано два раздела в стандартном списке с названиями классов в COM (+один общий).
Функции поддерживают многопоточные расчеты.
Работа с функциями как с обычными (различий нет). Обычные написаны тоже на С/С++ под C API.

Список C API - функций в Excel:
Блок BedvitXLLBignumArithmeticInteger:
1.ConvertBaseInteger - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36).
Блок BedvitXLLBignumArithmeticFloat:
1.SumFloat - сложение двух длинных/обычных чисел с плавающей точкой
2.SubtractFloat - вычитание двух длинных/обычных чисел с плавающей точкой
3.MultiplyFloat - умножение двух длинных/обычных чисел с плавающей точкой
4.DivideFloat - деление двух длинных/обычных чисел с плавающей точкой
5.PowerFloat - возведение в степень длинного/обычного числа
6.RootFloat - извлечение квадратного корня из длинного/обычного числа

Так же в XLL ресурсы упакована COM.DLL (первый блок проекта), распаковывается и устанавливается под пользователем - автоматом.
Поэтому открываем XLL или устанавливаем как надстройку - готово (ничего регистрировать не надо).
Пишем код в VBA и работаем. Советую раннее связывание. Видим свойства и методы объекта.
Оные можно посмотреть и в диспетчере объектов (см. рис.)
Т.е. при открытии XLL можно работать как с новыми C API функциями, так и с COM.DLL через VBA.

Примеры см. ниже.

Ресурсы:
MPIR library, Edition 3.0.0 (freely distributable librarys)
http://mpir.org/
+ my code written in C / C ++

©2018, BedvitCOM, BedvitXLL
License: Freely distributable library

Где тестировалось:
Пример №1 (Расширенный): VBA - раннее связывание:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub RUN() 'ЗАПУСКАЕМ ДЛЯ РАННЕГО СВЯЗЫВАНИЯ
'On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid "{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}", 1, 0: Continue ' подключаем библу "BedvitCOM" в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)
'Для раннего связывания сначала включаем в References библу, потом в конце кода отключаем. Для позднего связывания этого не нужно (см.ниже).
'Если BedvitCOM не оключать, могут быть ошибки в этом файле при отсутствии зарегестрированной BedvitCOM - выслали кому-то файл, или открыли из другого ПК и т.д., где не установлеена или не открыта надстройка BedvitXLL (которая автоматом распаковывает и регистрирует библиотеку BedvitCOM в реестре) или не зарегистрированна BedvitCOM вручную
End Sub
Sub Continue() '(через индексы - расширенный пример)
Dim I As BignumArithmeticInteger: Set I = New BignumArithmeticInteger 'Создаем массив целых больших чисел и арифметикой (класс)
Dim F As BignumArithmeticFloat:   Set F = New BignumArithmeticFloat  'Создаем массив больших чисел с плавающей точкой и арифметикой (класс)
 
I.Bignum(1) = "111" & String$(100, "1") 'добавляем число из 103 единиц в первое целое длинное число
I.BignumSet 1, "111" & String$(100, "1") 'или так
F.SizeBits(1) = 256 'задаем размер в битах для 1го числа с плавающей точкой
F.SizeBits(2) = 256 'задаем размер в битах для 2го числа с плавающей точкой
F.SizeBits(3) = 256 'задаем размер в битах для 3го числа с плавающей точкой
F.Bignum(1) = I.Bignum(1) 'копируем данные из одного класса чисел в другой (из первого в первое)
F.Clone 2, 1 'копируем в рамках одного класса число из первого во второе, т.е. число 2 = числу 1
'в рамках одного класса такое копирование на порядки быстрее
F.Sum 3, 2, 1 'суммируем в 3е число первое и второе: число3 = число2 + число1
'логика всей арифметики в классах предполагает получение результата в первом параметре(левой части выражения) по аналогии с "x =..."
Debug.Print F.Bignum(3) 'смотрим результат в третьем числе
'2.222222222222222222222222222222222222222222222222222222222222222222222222222222E+102
I.Help 'смотрим Help
F.FileGet 3, "C:\1.txt" 'сохраняем 3-е число в файл "C:\1.txt"
F.Clear 1 'освобождаем память для 1-го числа объекта F (число =0)
F.Clear 'освобождаем память для всего объекта F (число =0)
I.Clear 'освобождаем память для всего объекта I (число =0)
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("BedvitCOM") 'оключаем библу в References
End Sub
Пример №2: 1С
1C
1
2
3
4
5
6
7
8
F = Новый COMОбъект("BedvitCOM.BignumArithmeticDouble"); //Создаем массив больших чисел с плавающей точкой и арифметикой (класс)
F.SizeBitsSet(1,256); //задаем размер в битах для 1го числа с плавающей точкой
F.SetBignum(1, "11111"); //присваиваем данные для 1го числа
F.Power(1,1,51561); //возводим в степень 51561 первое число и кладем его в первое же число.
f = F.Bignum(1); //кладем данные в переменную из первого числа
Сообщить(f); //смотрим
F.Help(); //смотрим Help
F.Clear(1); 'освобождаем память первого числа

Пример №3 (Простой): VBA - через буквенное обозначение, позднее связывание
Visual Basic
1
2
3
4
5
6
7
8
Dim A, B, C: A = 1: B = 2: C = 3
Dim I As Object: Set I = CreateObject("BedvitCOM.BignumArithmeticInteger") 'Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet A, "12324344435654132546546546564453131" 'задаем данные в число A
I.BignumSet B, "34534534546546546546554665513213211" 'задаем данные в число B
I.Sum C, A, B 'C=A+B
Debug.Print I.Bignum(B) 'смотрим
I.Help 'смотрим Help
I.Clear  'освобождаем память для всего объекта I

Пример №4: 1С - через буквенное обозначение
1C
1
2
3
4
5
6
7
8
A=1; B=2; C=3; 
I = Новый COMОбъект("BedvitCOM.BignumArithmeticInteger"); //Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet(A,"12324344435654132546546546564453131");  //задаем данные в число A
I.BignumSet(B,"34534534546546546546554665513213211");  //задаем данные в число B
I.Sum(C,A,B); //C=A+B
Сообщить(I.Bignum(C)); //смотрим данные в числе С
I.Help(); //смотрим Help
I.Clear(); //освобождаем память для всего объекта I

26/03/2018 - Версия 0.0.0.1 под x64.


05/04/2018 - Новая версия BedvitCOM v.1.0.0.2 и BedvitXLL v.1.0.0.2

Изменения:
1. Изменен порядок аргументов в методе "BignumSet" (теперь, как во всех других методах, номер длинного числа в массиве - стоит первым аргументом), см.под спойлером
Кликните здесь для просмотра всего текста
Ранее было так:
I.BignumSet "6546414654564" , 1
теперь так:
I.BignumSet 1, "6546414654564"

2. Добавлены новые методы в два класса (запись длинного числа в файл .txt и чтение из файла)
.FileSet, .FileGet (описание в .Help и ниже)
3. Собраны библиотеки COM и XLL в 32-разрядной версии (с корректным Help-ом, описанием интерфейса).


24/04/2018 - Новая версия BedvitCOM v.1.0.0.3 и BedvitXLL v.1.0.0.3 (поддержка х32 и х64)

1. Добавлены новые функции в два класса библиотеки COM - арифметика длинных чисел с обычными, т.е. теперь можно совершать арифметические действия длинных чисел с обычными.
2. Добавлен механизм очистки/освобождения памяти как для одного числа, так и для класса/объекта в целом.
3. Сделано новое описание для всех свойств и методов двух классов на русском языке в справке (см. под спойлером и в .HELP)
4. XLL теперь удаляет данные из реестра (COM.DLL) под пользователем при закрытии надстройки.


Свойства и методы последней версии библиотеки COM (есть в .Help):
Кликните здесь для просмотра всего текста
Свойства и Методы BignumArithmeticInteger

1.Help(); HTML Справка (без параметров).

2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.

3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.

4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.

5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.

6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()

7.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2

8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)

9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.

10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.

11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2

12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.

13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.

14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.

15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.

16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.

17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.

18.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1

19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.

20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!

21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1

22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1

23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1.


Свойства и Методы BignumArithmeticFloat

1.Help(); HTML Справка (без параметров).

2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).

3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).

(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).

4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.

5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.

6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.

7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().

8.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2

9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)

10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.

11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.

12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.

13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.

14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.

15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2

16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.

17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.

18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.

19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.

20.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1

21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).

22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).

23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1
Миниатюры
Нажмите на изображение для увеличения
Название: BedvitXLL.PNG
Просмотров: 322
Размер:	23.0 Кб
ID:	4738   Нажмите на изображение для увеличения
Название: BedvitXLL2.PNG
Просмотров: 253
Размер:	14.8 Кб
ID:	4739   Нажмите на изображение для увеличения
Название: BedvitCOM3.PNG
Просмотров: 211
Размер:	31.9 Кб
ID:	4786  

Нажмите на изображение для увеличения
Название: BedvitCOM5.PNG
Просмотров: 220
Размер:	68.3 Кб
ID:	4787  
Изображения
 
Вложения
Тип файла: zip BedvitDLLv0.0.0.1.zip (560.0 Кб, 59 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x32.zip (474.2 Кб, 57 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x64.zip (556.8 Кб, 38 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x32.zip (701.8 Кб, 34 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x64.zip (754.7 Кб, 35 просмотров)
Размещено в Без категории
Просмотров 3318 Комментарии 156
Всего комментариев 156
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Кстати я так не увидел С++ кода который нужен для подрузки СOM библиотеки под Linux
    Запись от Avazart размещена 05.04.2018 в 21:23 Avazart на форуме
  2. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Это лишний трешовй код, о чем я сразу говорил.
    Нет. Трешовый код это экспорт 50 функций.

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Очевидно что просто экспортануть классы куда легче.
    Легче для кого? Покажите пример и соответственно пример использования библиотеки например на VBA или 1С. Я показал пример того как это просто использовать в классах VB-подобных языков (VB6, VBA, VB.NET и т.п.) На C/C++ это также очень просто использовать. Для других платформ можно вообще не использовать Automation и код соответственно будет меньше.
    Запись от The trick размещена 05.04.2018 в 21:25 The trick вне форума
    Обновил(-а) The trick 05.04.2018 в 22:42
  3. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Кстати я так не увидел С++ кода который нужен для подрузки СOM библиотеки под Linux
    Вы пример скачивали? Там же есть закомментированный код:
    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    int main(void) {
        IUnknown *pUnk = CreateCOMObject();
        ISum *pSum = 0;
        IDiff *pDiff = 0;
     
        pUnk->pVtbl->QueryInterface(pUnk, &IID_ISum, &pSum);
     
        pSum->pVtbl->Sum(pSum, 10, 20);
     
        pSum->pVtbl->UnkVTable.QueryInterface(pUnk, &IID_IDiff, &pDiff);
     
        pDiff->pVtbl->Diff(pUnk, 10, 20);
     
        pDiff->pVtbl->UnkVTable.Release(pDiff);
        pSum->pVtbl->UnkVTable.Release(pSum);
        pUnk->pVtbl->Release(pUnk);
     
        return 0;
     
    }
    Запись от The trick размещена 05.04.2018 в 21:27 The trick вне форума
  4. Старый комментарий
    Аватар для Avazart
    Линукс Вам скажет на такое что не знает никакой IUnknown и CreateCOMObject() итд...
    Запись от Avazart размещена 05.04.2018 в 22:55 Avazart на форуме
  5. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Линукс Вам скажет на такое что не знает никакой IUnknown и CreateCOMObject() итд...
    Не скажет. Описания предоставлены.
    Запись от The trick размещена 05.04.2018 в 22:56 The trick вне форума
  6. Старый комментарий
    Аватар для Avazart
    Вы предлагаете весь треш с гуидами и прочим тянуть в проект (помимо 50-ф-ции которые все равно придется описать)?
    Запись от Avazart размещена 05.04.2018 в 23:01 Avazart на форуме
  7. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Вы предлагаете весь треш с гуидами и прочим тянуть в проект (помимо 50-ф-ции которые все равно придется описать)?
    Какой треш? Этот "треш" используется повсеместно в Windows и все работает безупречно, и многие сторонние разработчики предоставляют объектную модель на основе COM (в том же VST3, CorelDraw, 3DsMax, Photoshop).
    Для данной библиотеки нужно всего пару GUID'ов (в зависимости от того как будет реализовываться создание объекта в не-win среде). Все остальное это описание функций, больше ничего.
    Взяв простой пример на C описание экспортируемых функций будет почти таким же как и описание методов интерфейса. Плюсы? Уже обсуждались, большое количество языков, что невозможно с использованием экспортируемых функций. Делая все тоже самое на C++ код становится вообще элементарным на основе наследования интерфейсов.
    Для конечного пользователя вообще никаких проблем нет, просто подключил хидер и пользуйся, ничего дополнительно не нужно писать. Вы же предлагаете действительно треш, оборачивать структуры в классы и экспортировать их - это нормально? А для тех же VBA'шников писать 50 экспортируемых функций, объявлять типы и т.п. Для vbs или 1C вообще забыть о библиотеке. Это и есть треш.
    Нормально это когда ты делаешь так:
    obj = GetSomeObject();
    obj->meth....
    И так делаешь везде и в Windows, и на Linux, да хоть в AVR контроллере, неважно. Везде всегда одинаково.
    Запись от The trick размещена 05.04.2018 в 23:18 The trick вне форума
  8. Старый комментарий
    Цитата:
    Сообщение от The trick Просмотреть комментарий
    да хоть в AVR контроллере, неважно.
    А рационально ли?
    Возьмем к примеру распространенный AVR МК ATmega328, у которого 2 КБ оперативной памяти. Думаете стоит ее тратить на накладные расходы COM модели? Или для нее можно найти более рациональное применение?
    А если речь идет об ATtiny13 у которого только 64 байта ОЗУ, то COM модель программы может просто не влезть в МК.
    Запись от locm размещена 06.04.2018 в 00:05 locm вне форума
  9. Старый комментарий
    Цитата:
    Сообщение от locm Просмотреть комментарий
    А рационально ли?
    Не в этом вопрос, а в том что это кроссплатформенно вопреки многим заблуждениям. Можно реализовать и нужно реализовать это совершенно разные понятия. Смысла реализации COM в МК AVR не больше чем реализации DLL в МК AVR. Это просто не нужно.

    Цитата:
    Сообщение от locm Просмотреть комментарий
    Возьмем к примеру распространенный AVR МК ATmega328, у которого 2 КБ оперативной памяти. Думаете стоит ее тратить на накладные расходы COM модели?
    Я думаю что любая объектная модель в таких ограничениях не имеет смысла, а не только COM. COM модель почти не отличается от C++ модели на абстрактных классах (тот же указатель на vtbl). Оперативной памяти потратится не больше чем на создание обычного объекта (структуры).

    Цитата:
    Сообщение от locm Просмотреть комментарий
    А если речь идет об ATtiny13 у которого только 64 байта ОЗУ, то COM модель программы может просто не влезть в МК.
    Модель влазит не в SRAM, а во FLASH (таблица указателей). В SRAM будут обычные структуры. Небольшой оверхед будет с FLASH для имплементации IUnknown. Но повторюсь это не имеет смысла, пример я привел лишь для того чтобы показать что COM объект платформонезависим и с ним легко работать на любом ЯП.
    Запись от The trick размещена 06.04.2018 в 12:03 The trick вне форума
  10. Старый комментарий
    Аватар для Avazart
    Цитата:
    Какой треш? Этот "треш" используется повсеместно в Windows и все работает безупречно
    Windows и безупречно не совместимые вещи...

    Кстати я уже не говорю что стоило бы забыть про написание кода на basic, если бы не указанные продукты и поддержка совместимости ...


    Цитата:
    большое количество языков, что невозможно с использованием экспортируемых функций.
    А где это не возможен экспорт/импорт ф-ции?
    В нормальном языке повторюсь это есть.

    Если Вы даже используете js как плагин то логично что движок js должен иметь расширение для этого, а если не имеет то скорее так и должно быть (например в целях безопасности).
    Запись от Avazart размещена 06.04.2018 в 13:23 Avazart на форуме
    Обновил(-а) Avazart 06.04.2018 в 13:31
  11. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Windows и безупречно не совместимые вещи...
    Есть претензии по работе COM в Windows?
    Запись от The trick размещена 06.04.2018 в 13:24 The trick вне форума
  12. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Кстати я уже не говорю что стоило бы забыть про написание кода на basic, если бы не указанные продукты и поддержка совместимости ...
    Да просто так говорить много кто может, есть ли толк от этого и нужно ли слушать такого человека?
    Запись от The trick размещена 06.04.2018 в 13:28 The trick вне форума
  13. Старый комментарий
    Аватар для Avazart
    А я говорю что-то новое?
    Я считал что это очевидно.
    Запись от Avazart размещена 06.04.2018 в 13:38 Avazart на форуме
  14. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    А я говорю что-то новое? Я считал что это очевидно.
    Да Вы много чего говорите, только толк от этого какой? Есть притензии к COM - пожалуйста предъявите. Пока ничего конкретного нет, только заблуждения. Вы так и не сказали чем метод на основе экспортирования 50 функций лучше чем экспорт одной функции которая возвратит COM объект с теме-же 50 методами? С моей стороны это лучше в плане покрытия большего количества ЯП, нравятся они Вам или не нравятся - это не имеет значения в данном контексте. То что COM объект кросплатформенный - я думаю Вы не будете отрицать больше и дезинформировать людей? То что это может работать без регистрации и использования реестра - тоже думаю понятно?
    Запись от The trick размещена 06.04.2018 в 13:48 The trick вне форума
  15. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    А где это не возможен экспорт/импорт ф-ции?
    Уже приводили примеры. Посмотрите обсуждение.

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    В нормальном языке повторюсь это есть.
    Критерий "нормальности", пожалуйста. Я тоже могу сказать - в нормальном языке есть поддержка работы с COM. Я скажу даже больше, если ЯП поддерживает импорт функций из DLL, то он уже поддерживает работу с COM. Т.е. "нормальный язык" в Вашей терминологии автоматически поддерживает работу с COM. Но вот в обратную сторону это не всегда работает.

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Если Вы даже используете js как плагин то логично что движок js должен иметь расширение для этого, а если не имеет то скорее так и должно быть (например в целях безопасности).
    Я вообще не пользуюсь js. Не понимаю для чего Вы это написали и причем тут COM. Поясните, если не трудно.
    Запись от The trick размещена 06.04.2018 в 13:59 The trick вне форума
  16. Старый комментарий
    Аватар для Avazart
    Цитата:
    Сообщение от The trick Просмотреть комментарий
    Я вообще не пользуюсь js. Не понимаю для чего Вы это написали и причем тут COM. Поясните, если не трудно.
    Вы сами упомянули js вот откуда оно:

    Цитата:
    Сообщение от The trick Просмотреть комментарий
    Мы говорим о том что можно работать, а не о том что не нужно. Можно работать - плюс, нельзя (как в случае vbs/js) - минус.
    Запись от Avazart размещена 06.04.2018 в 14:14 Avazart на форуме
    Обновил(-а) Avazart 06.04.2018 в 14:15
  17. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Вы сами упомянули js вот откуда оно:
    Так я упомянул в плане работы с COM, а Вы про что написали?
    Запись от The trick размещена 06.04.2018 в 14:17 The trick вне форума
  18. Старый комментарий
    Аватар для Avazart
    Цитата:
    Сообщение от The trick Просмотреть комментарий
    Вы так и не сказали чем метод на основе экспортирования 50 функций лучше чем экспорт одной функции которая возвратит COM объект с теме-же 50 методами?
    С тем что 50 ф-ции Вы и так и так объявляете.
    Но в случае COM у Вас треш код виде структур указателей подсчета ссылок ипр, а в случае ф-ции нормальная обвертка в виде класса.
    (50 ф-ции можно легко обвернуть в класс/классы и использовать как полноценный объект)
    Запись от Avazart размещена 06.04.2018 в 14:19 Avazart на форуме
    Обновил(-а) Avazart 06.04.2018 в 14:20
  19. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    С тем что 50 ф-ции Вы и так и так объявляете.
    Где, в импорте?

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Но в случае COM у Вас треш код виде структур указателей подсчета ссылок ипр, а в случае ф-ции нормальная обвертка в виде класса.
    Почему обертка для COM - это треш, а обертка в виде класса - не треш? Хотелось бы посмотреть на Ваш не треш в виде обертки класса через экспортируемые функции для ЯП типа VBA, VB6 (я не говорю про vbs/js в которых уже нельзя будет работать с этой библиотекой). Сейчас для подключения этой библиотеки нужно всего-лишь пру строк в клиентской программе. В Вашем не треш варианте как это будет выглядить. Для C подобных языков подключение и использование этой библиотеки клиентским приложением также будет простым.
    Второй вопрос, а как Вы собираетесь отслеживать время жизни объекта? Дополнительную функцию создавать для уничтожения объекта? Если так, то какая разница между такой функцией и методом Release с подсчетом ссылок? Чем этот метод хуже, и почему тогда в умных указателях используют этот метод?

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    (50 ф-ции можно легко обвернуть в класс/классы и использовать как полноценный объект)
    Чем такой объект лучше COM объекта? Т.е. оборочивание в классы это не треш подход, а оборачивание в COM - треш? Я не пойму.
    Запись от The trick размещена 06.04.2018 в 14:34 The trick вне форума
  20. Старый комментарий
    Аватар для Avazart
    Ну вот Ваш код:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    int main(void) 
    {
        IUnknown *pUnk = CreateCOMObject();
        ISum *pSum = 0;
        IDiff *pDiff = 0;
     
        pUnk->pVtbl->QueryInterface(pUnk, &IID_ISum, &pSum);
     
        pSum->pVtbl->Sum(pSum, 10, 20);
     
        pSum->pVtbl->UnkVTable.QueryInterface(pUnk, &IID_IDiff, &pDiff);
     
        pDiff->pVtbl->Diff(pUnk, 10, 20);
     
        pDiff->pVtbl->UnkVTable.Release(pDiff);
        pSum->pVtbl->UnkVTable.Release(pSum);
        pUnk->pVtbl->Release(pUnk);
     
        return 0;
     
    }
    А мог бы выглядеть так:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    int main() 
    {
        Sum sum; 
        int result = sum.sum(10,15);
     
        Diff  diff;
        result = diff.diff((10,20);
     
        return 0;
    }
    Разница есть?
    Запись от Avazart размещена 06.04.2018 в 15:26 Avazart на форуме
    Обновил(-а) Avazart 06.04.2018 в 15:28
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru