Длинная арифметика (Bignum arithmetic) c COM-интерфейсом и C API Functions для Excel на библиотеках MPIR. С/С++
Запись от bedvit размещена 26.03.2018 в 22:15
Показов 26447
Комментарии 160
|
Теперь часть библиотеки BedvitCOM. Проект основан на исходниках (на С++) библиотеки MPIR, Edition 3.0.0. (на основе библиотеки GMP) Полностью написан на С/С++. Скорость на порядок выше предыдущего решения. Реализовал два блока в проекте: 1.DLL c COM интерфейсом. Реализованы dual-интерфейсы с Automation-совместимыми типами данных, структур (поддержка как раннего вывязывания, так и позднего). Ранний предпочтительнее в части скорости (на 50% быстрее передача данных через СОМ-обертку). Реализовано два класса: класс целых чисел с арифметикой (BignumArithmeticInteger) и класс чисел с плавающей точкой (BignumArithmeticFloat). При создании экземпляра класса создается массив К числам можно обращаться по индексам (можно переменной присвоить индекс и работать с переменными, см. пример ниже) BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память. BignumArithmeticFloat (Bignum), задается изначально, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер - double). Размер чисел ничем не ограничен, кроме вашей оперативки. Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов) Регистрация стандартная: Админ: Regsvr32 "FullName.DLL" !ПОМНИМ! В Win10 регистрация под правами админа: "правая кнопка" - "Пуск" -"Командная строка (администратор)" Пользователь: Regsvr32 /i /n "FullName.DLL" Удалить из реестра: Regsvr32 /u "FullName.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. 26.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.) Свойства и Методы 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 24.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.) 25.BSTR* String = GetToBignumInt(LONG Bignum, LONG BignumBase=10); Метод. Преобразовать Bignum из Float в Integer и вывести. ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях. Начиная с v2.0.0.0. 2.XLL для Excel с C API функциями. Добавил базовый набор. Будет потребность в дополнительных - добавлю по запросу. Для функций создано два раздела в стандартном списке с названиями классов в COM (+один общий). Функции поддерживают многопоточные расчеты. Работа с функциями как с обычными (различий нет). Обычные написаны тоже на С/С++ под C API. Список C API - функций в Excel: 1.BedvitXLLBignumArithmeticInteger - функции для работы с длинными целыми числами. Функции: 1.1 SumInteger() - сложение двух длинных/обычных целых чисел 1.2 SubtractInteger() - вычитание двух длинных/обычных целых чисел 1.3 MultiplyInteger() - умножение двух длинных/обычных целых чисел 1.4 DivideInteger() - деление двух длинных/обычных целых чисел - Неполное частное 1.5 ModInteger() - деление двух длинных/обычных целых чисел - Остаток от деления 1.6 PowerInteger() - возведение в степень длинного/обычного целого числа 1.7 ConvertBaseInteger() - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36). 1.8 FactorialInteger() - факториал задаваемого числа. 2.XLLBignumArithmeticFloat - функции для работы с длинными дробными числами. Функции: 2.1 SumFloat() - сложение двух длинных/обычных чисел с плавающей точкой 2.2 SubtractFloat() - вычитание двух длинных/обычных чисел с плавающей точкой 2.3 MultiplyFloat() - умножение двух длинных/обычных чисел с плавающей точкой 2.4 DivideFloat() - деление двух длинных/обычных чисел с плавающей точкой 2.5 PowerFloat() - возведение в степень длинного/обычного числа 2.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 - через индексы, раннее+позднее связывание:
Пример №3 (Простой): VBA - через буквенное обозначение, позднее связывание
Пример №4: 1С - через буквенное обозначение
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) под пользователем при закрытии надстройки. 29/04/2022 - Новая версия BedvitCOM v.2.0.0.0 1.Класс/массив Bignum теперь может быть любого размера, а не как ранее 256 чисел. Увеличение размера происходит автоматом, в зависимости от последнего задаваемого индекса числа в массиве. 2.В связи с этим добавлен метод BignumArraySize() - Возвращает количество чисел Bignum в созданном классе/массиве. 3.Добавлено преобразование Bignum из Float в Integer (обратное преобразование было возможно и ранее). Метод GetToBignumInt(LONG Bignum, LONG BignumBase=10). ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях. 4.Исправлен баг в выделением памяти для разных экземпляров одного и того же класса. Теперь для каждого экземпляра - свой участок памяти. 5.Теперь деструктор класса сам очищает память (при удалении класса или завершении процедуры в VBA). Методы Clear теперь нужны только там, где нужно освободить память в действующим классе. При завершении процедуры их писать не обязательно (для VB, и для языков, где класс уничтожается при завершении процедуры - запуская деструктор). | ||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 160
Комментарии
-
На C? Или C++? Я скинул код на C. Второй момент это то что это не тот же самый код что показал я. У Вас Diff и Sum - это два разных объекта, а у меня это один объект.
Сообщение от Avazart
Запись от The trick размещена 06.04.2018 в 15:31
-
Какая вообще речь может быть про объекты в Си ?
Да без разницы.
Остальной код
Код в DLL:
Код для импорта:C++ 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 30 31 32 33 34 35 36 37
// Экспортируемый класс class Arifmetic { public: int sum(int a,int b) { return a+b;}; int diff(int a,int b) { return a-b;}; private: }; #ifdef __DLL__ #define DLL_SPEC extern "C" __declspec(dllexport) #else #define DLL_SPEC extern "C" __declspec(dllimport) #endif // __DLL__ // Экспорт ф-ций: typedef void* ArifmeticHandle; ArifmeticHandle DLL_SPEC Arifmetic_open() { return reinterpret_cast<ArifmeticHandle>(new Arifmetic); } void DLL_SPEC Arifmetic_close(ArifmeticHandle handle) { delete reinterpret_cast<Arifmetic*>(handle); } int DLL_SPEC Arifmetic_sum(ArifmeticHandle handle, int a int b) { return reinterpret_cast<Arifmetic*>(handle)->sum(a,b); } int DLL_SPEC Arifmetic_diff(ArifmeticHandle handle, int a int b) { return reinterpret_cast<Arifmetic*>(handle)->diff(a,b); }
C++ 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
#ifdef __DLL__ #define DLL_SPEC extern "C" __declspec(dllexport) #else #define DLL_SPEC extern "C" __declspec(dllimport) #endif // __DLL__ // Импорт ф-ций: typedef void* ArifmeticHandle; ArifmeticHandle DLL_SPEC Arifmetic_open(); void DLL_SPEC Arifmetic_close(ArifmeticHandle handle); int DLL_SPEC Arifmetic_sum(ArifmeticHandle handle, int a int b); int DLL_SPEC Arifmetic_diff(ArifmeticHandle handle, int a int b); // Обвертка class Arifmetic { public: Arifmetic():(handle_(Arifmetic_open()){}; ~Arifmetic(){ Arifmetic_close(handle_); }; int sum(int a,int b) { return Arifmetic_sum(handle_, a, b); }; int diff(int a,int b) { return Arifmetic_diff(handle_, a, b); }; private: ArifmeticHandle handle_; };
C++ 1 2 3 4 5 6 7 8
int main() { Arifmetic a; int result = a.sum(10,15); result = a.diff(10,20); return 0; }
Запись от Avazart размещена 06.04.2018 в 15:39
-
Тогда зачем Вы сравниваете 2 кода на двух разных языках? Я Вам предоставил код на C и Вы мне предоставьте код на C.
Сообщение от Avazart
Вот Вам код на VB6:
Проще?Visual Basic 1 2 3 4 5 6 7 8 9 10 11 12
Dim cSum As ISum Dim cDiff As IDiff ChDir App.Path Set cSum = CreateCOMObject() MsgBox cSum.Sum(10, 20) Set cDiff = cSum MsgBox cDiff.IDiff(10, 20)
Нет. Такое не прокатит. Во-первых, просто вызывается 2 метода какого-то класса (где описание класса). Во-вторых, не понятно как контролируется время жизни объекта, а если я его передаю куда-то еще (это же DLL), когда освобождать память? В-третьих, непонятно каким стандартизированным бинарно методом запрашивать интерфейс? К примеру, у меня плагин выдает мне объекты для работы со звуком, они имеют метод Generate(). Люди пишут плагины На разных языках, и все имеют метод Generate(). Далее я захотел усовершенствовать, добавляю еще метод SetVolume(). В COM я просто создаю новый интерфейс и новые плагины реализуют его, старые также работают исправно. Как в Вашем случае такое реализуется? В-четвертых, как работать с данной библиотекой из тех же языков что не поддерживают соглашение вызова thiscall, не поддерживают импорт из DLL?
Сообщение от Avazart
Запись от The trick размещена 06.04.2018 в 16:08
-
Запись от Avazart размещена 06.04.2018 в 16:11
-
Чем бейсик плох?
Сообщение от Avazart
Для того чтобы оценить кроссплатформенность COM нужна например *.so ActiveX библиотека (содержащая функции DllRegisterServer, DllUnregisterServer, DllGetClassObject и т. д.) скомпилированная для Linux и пример ее работы с ней. Тогда можно будет оценить преимущества COM перед экспортом функций из DLL (SO в Linux). Понятно что если захотеть то это возможно, но настолько нерационально (приведет к неоправданному усложнению и увеличению размера кода), что смысла в этом нет.
Сообщение от The trick
Запись от locm размещена 06.04.2018 в 16:40
-
Вижу, но зачем Вы мне скинули код на C++? Покажите мне аналогичный на C. Я же Вам предоставил код на C чтобы показать кроссплатформенность и работу на разных ЯП.
Сообщение от Avazart
Ответов на остальные вопросы нет.
Так и есть. Грубо говоря, я тоже мог имплементировать один интерфейс и обойтись без QueryInterface at all.
Тоже самое. А если клиентский код неявно сохраняет хендл (к примеру передает в другую DLL которая использует его). Как определить когда вызывать Arifmetic_close?
Тоже самое. Как это будет выглядеть? А если к примеру DLL создает множество объектов как сабж?
Нет ответа.
Если Вы приводите пример с C++, то посмотрите как работать с COM в C++:
pD3D и pD3DDevice - 2 указателя на COM объекты. Сложнее чем у Вас? Если использовать ComPtr то вообще можно не заботится о жизни объекта и не вызывать Release.C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int main() { IDirect3D9Ex *pD3D; IDirect3DDevice9Ex *pD3DDevice; Direct3DCreate9Ex(D3D_SDK_VERSION, &pD3D); pD3D->CreateDeviceEx(..., &pD3DDevice); pD3DDevice->SetViewport(...); pD3DDevice->Clear(0, NULL, ....); pD3DDevice->Release(); pD3D->Release(); }
Запись от The trick размещена 06.04.2018 в 16:42
-
Запись от Avazart размещена 06.04.2018 в 16:45
-
Не путай ActiveX и COM. Если нужна COM библиотека под Linux - возьми и сделай, в чем проблема? Я показал пример на C, он скомпилируется подо что угодно.
Сообщение от locm
Преимущества уже не раз описывались здесь, мне лень их постоянно писать.
Сообщение от locm
Не приведет.
Сообщение от locm
Запись от The trick размещена 06.04.2018 в 16:47
-
А я привел Вам пример на VB6, потому что это ООП язык. Смысл тогда критиковать код на C (о котором Вы говорите и сравнивать его с C++? Вот Ваша цитата:
Сообщение от Avazart
И код на C++. Я как контрпример могу показать так:
Еще проще Вашего на C++.Visual Basic 1
MsgBox CreateCOMObject.Sum(10, 20)
Запись от The trick размещена 06.04.2018 в 16:53
-
Что скажите по этому поводу о Си и C++?
Сообщение от Avazart
Существует много диалектов бейсика, о каких из них идет речь?
Я не путаю потому что в данной записи именно ActiveX DLL для длинной арифметики. Или я не прав?
Сообщение от The trick
Запись от locm размещена 06.04.2018 в 16:59
-
Так спор идет о COM, а не о ActiveX. Она ActiveX для Windows, а для Linux она может предоставлять COM объекты. Клиентский код работы с объектами не поменяется вообще. Т.е. это в Windows будет код:
Сообщение от locm
В Linux:C++ 1 2 3
CoCreateInstance(....); Object->SomeMethod(1, 2); Object->OtherMethos(BSTR("String"), 11212);
Соответственно в Linux CoCreateInstance просто заглушка которая будет создавать объект из DLL например через туже DllGetClassObject или же какой-то другой импорт. Это уже детали реализации.C++ 1 2 3
CoCreateInstance(....); Object->SomeMethod(1, 2); Object->OtherMethos(BSTR("String"), 11212);
Запись от The trick размещена 06.04.2018 в 17:08
-
Запись от Avazart размещена 06.04.2018 в 17:31
-
Речь (по крайней мере я веду) о DLL из этой записи, а она ActiveX.
Сообщение от The trick
Вот, приведите пример работы с ActiveX в Linux. Посмотрим на код. В теории это все "красиво", но хотелось бы увидеть как оно будет на практике.
Сообщение от The trick
Запись от locm размещена 07.04.2018 в 11:13
-
Ну мы с Avazart дискутировали о COM, и ты отвечаешь мне на посты про COM. Во-вторых раз мы обсуждаем DLL из этой записи то она для Windows, при чем тут Linux тогда?
Сообщение от locm
Во-первых, я никогда не писал под Linux. Я дал код на C, кто захочет - тот скомпилирует. Если есть какие-то веские основания полагать что это не будет работать - так озвучите их.
Сообщение от locm
Запись от The trick размещена 07.04.2018 в 14:24
-
Данную путаницу внес автор записи. Он все время пишет о COM, но его DLL это ActiveX. Видимо из-за этого возникло недопонимание. Считай что из-за этой путаницы под COM подразумевалось ActiveX.
Сообщение от The trick
Запись от locm размещена 07.04.2018 в 14:52
-
Никакой путаницы нет, его DLL - COM Dll, т.к. ActiveX основан на COM. Это частный случай COM.
Сообщение от locm
Второй момент я уже написал:
Запись от The trick размещена 07.04.2018 в 14:54
-
Запись от Avazart размещена 07.04.2018 в 15:05
-
В данном примере просто не скомпилируется.
Сообщение от Avazart
Запись от The trick размещена 07.04.2018 в 15:06
-
Т. е. ActiveX для Linux может предоставлять COM объекты? Есть пример реализации ActiveX для Linux?
В чем отличие COM DLL от ActiveX DLL?Запись от locm размещена 07.04.2018 в 15:10
-
Запись от Avazart размещена 07.04.2018 в 15:19


