Аналог ole для linux

Обновлено: 28.06.2024

Одним из недостатком Native API является то, что мы не можем возвратить ВК и передать параметры ВК в метод ВК. Поэтому пришлось возвращать ссылку на объект в виде строки. И создавать методы для обертки ВК над строкой.

Не буду описывать внутренности ВК. Описание и исходники можно посмотреть

Там же можно скачать и исходники.

Сначала определим вспомогательные методы для создания объектоа типов и обертки.

Я создал каталог, в который положил библиотеки

AddInNetObjectToNative.dll это сама ВК

Заодно проверим передаваемые типы.

Ух ты, и это работает!

Еще одна особенность Native API в том, что мы можем получить двоичные данные, но вот передать их в параметры метода метода ВК нет.

Дальше идет проверка вызова сторонней библиотеки и работа с двоичными данными.

Самое главное, что мы можем использовать сторонние библиотеки, которые должны лежать рядом с NetObjectToNative.dll

К сожалению, в отличие от COM в .Native ВК мы не можем использовать энумераторы

Поэтому для упрощения использования массивов и списков создана функция ПолучитьЭнумератор

Теперь перейдем к более грустному.
В этой статье был тест скорости, время вызова которого составляло более 300 000 вызовов в секунду.

Проведем аналогичный тест на 1С:

То есть скорость вызова уменьшилась до 20 000 вызовов в секунду.
Но и этого достаточно, так обычно вызываются более тяжелые методы.


Добавил поддержку IDynamicMetaObjectProvider (DynamicObject,ExpandoObject). В исходниках есть примеры. Это важно при использовании различного рода парсеров


Теперь стоит поговорить о недостатках 1С реализации Технологии Внешних Компонент.

1. Абсолютно не нужны методы FindMethod, FindProp, IsPropReadable, IsPropWritable, GetNParams, HasRetVal, GetParamDefValue

Так как у методов

bool SetPropVal и bool GetPropVal есть возвращаемое значение об успешном выполнении

Информация об ошибке возвращается через AddError.

Да и вызов по индексу это анахронизм от IDiapatch, где было описание диспинтерфейсов для увеличения скорости вызова.

2. При возвращении методами SetPropVal и GetPropVal исключение не вызывается

3. Зачем-то происходит установка свойств там, где в коде этого не требуется.

4. Вызывается метод как функция там, где метод вызывается как процедура.

5. Один из основных - это нельзя вернуть и передать экземпляр ВК из методов ВК.

Я лично не вижу никаких проблем. Определить значение для такого типа и установить ссылку в поле pInterfaceVal.

Подсчет ссылок происходит на стороне 1С. Передавать можно в том числе и объекты 1С только на время вызова метода.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Скажите, а таки чем вы руководствуетесь когда называете функции "Ъ", "Ъновый" и "Ътип" . Чтобы было сокращенно и было созвучно с Новый , а Ътип из той же оперы.
Мне лично, так код удобнее читать. Плюс за старания. Но по опыту скажу, если совмещать высокую нагрузку с внешними компонентами, до добра это не доводит.

(3) pbazeliuk,
Проблема тут не в самой компоненте, а интерфейсе, что 1С предоставляет.

Например практически все программисты 1С используют ComОбъект.

По моей методе можно использовать
NetОбъект,NetТип
JavaОбъект,JavaТип

И эти объявления будут реально кроссплатформенны.
При это различия с ComОбъект минимальны. Имя класса равноценно комовскому ProgID. При этом нет ограничений на используемые типы.
Ты можешь написать свою библиотеку поместить в определенное место и использовать её вместо COM. Без регистрации итд. Расширять возможности 1С станет легче.

При этом например нетовская библиотека весит всего 65 мегабайт, которую можно включить в дистрибутив и главное это кроссплатформенное решение. Причем нет ничего сложного передавать в параметрах и объекты 1С которые поддерживают аналогичный интерфейс. Можно пойти по пути подсчета ссылок в 1С, а доступ к объектам 1С только на время вызова метода ВК.

Мне нравится технология COM. Но речь пойдет не о технологии, восхвалении или недостатках COM, а опыте переноса и реализации на Linux. Велосипед? Целесообразность? Давайте не будем на этом заострять внимание.

COM-объект (1)

В общем понимании, объект класса, реализующий как минимум один COM-интерфейс. Реализация объекта в основном скрывается в динамически подключаемой библиотеке, называемой COM-сервер (2) , для использования публикуются и распространяются интерфейсы.

COM-интерфейс, абстрактный класс содержащий только чисто виртуальные функции. Выделяется особый интерфейс IUnknown, любой COM-объект обязан реализовывать данный интерфейс.

Каждый COM-интерфейс должен содержать некий свой идентификатор. В COM он определяется структурой GUID и вот тут столкнемся с первым недостатком COM. GUID непонятен и не читаем ну и все остальное описанное на Wiki. Нам он то же нужен, но в более читаемом и понятном виде (назовем его uiid).

Помимо идентификатора интерфейса, выделяется и идентификатор класса (clsuid), необходимый для создания объекта. В нашем случае, т.к. это более менее читаемый идентификатор, который может определять суть, можно пока забыть о их публикации (возможно это не хорошо).

Резюме
COM-объект, содержит единственный идентификатор класса. Реализует как минимум один COM-интерфейс — IUnknown (любой COM-интерфейс имеет уникальный идентификатор интерфейса). Разные реализации COM-объекта могут иметь один и тот же идентификатор класса (пример: release и debug версия).

COM-сервер (2)

Динамически подключаемой библиотека (для Linux это Shared object — so) реализующая как минимум один COM-объект. Сервер должен экспортировать определенный набор функций:


Создает объект класса по clsuid, увеличивает количество ссылок на so, каждый раз при успешном создании объекта. Вызов IUnknown::AddRef, так же должен увеличивать счетчик ссылок на so, а IUnknown::Release должен уменьшать.


Если количество ссылок на SO равно 0, то можно выгружать библиотеку.


Регистрирует в “реестре” все clsuid сервера. Вызывается единожды при инсталляции COM-сервера.

Пример SimpleHello, объявляем интерфейс IHello:

Набор макросов скрывает реализации функций, предоставляя более структурированное объявление и логику.

Dom::Implement<SimpleHello, IHello> — скрывает реализацию методов интерфейса IUnknown, добавляет “сахарок”, при объявлении интерфейсов реализуемых объектом (С++11 и variadic templates):

Интерфейс IRegistryServer — определяет набор методов работы с “реестром” COM-серверов.


“Реестр” COM-серверов (3)

Важность реестра можно недооценить, но он является наверное главным столпом COM. Microsoft пишет в системный реестр, создает сложную структуру описания интерфейсов и их атрибутов (idl), я пошел немного по другому пути.

В реализации реестр базируется на файловой системе.
Какие плюшки? Понятность, простота, возможность восстановления, особая плюшка при регистрации сервера можно задать некого рода namespace (директорию относительно базового реестра в которой будет регистрироваться объекты сервера), тем самым можно реализовать целостность и версионность приложений использующих технологию.

Из недостатков, возможные проблемы с безопасностью, подмена реализаций объектов.


Как использовать, пример приложения (4)

Для того чтобы заставить все работать потребуется еще небольшая “библиотечка” и небольшая “программка”.

“Библиотечка” — ни что иное как обертка реализующая и собирающая все в единое целое, работу с реестром, загрузку\выгрузку SO, создание объектов.
Она единственная должна быть указана при сборке приложения. Все остальное, “хочется верить”, она сделает сама.

Veizdem --> Veizdem



Просмотр профиля

Ищу аналоги COM объектов для загрузки/выгрузки XML, работы с XSD файлами, а так же аналог COMConnector под ОС Linux. Необходимо все делать без использования wine или windows. Кто что знает по данному поводу?

Сервер 1С на Debian, сервер БД PostgreSQL на CentOS, все клиенты на Kubuntu.

Vofka --> Vofka



Просмотр профиля Технология COM - это технология самой Windows. Если мы говорим о том, что есть какой-то COM объект - это само собой подразумевает то, что речь идет про Windows. Veizdem --> Veizdem



Просмотр профиля Технология COM - это технология самой Windows. Если мы говорим о том, что есть какой-то COM объект - это само собой подразумевает то, что речь идет про Windows.

То, что COM это сугубо плюшка Windows я знаю, меня интересует как те же действия выполнять на Linux, где нет COM объектов.

Вот нашел пример записи XML файла без использования COM:

И пример чтения XML файла без того же COM:

А такая же реализация но для COMConnector есть?

Так же не нашел, как работать с XSD.

Vofka --> Vofka



Просмотр профиля

COMConnector-а под Линуксом нету.


Потому что то, что вы выше привели - это делается средствами платформы. А платформа на 90+% (мне так кажется) работает одинаково и в Виндовсе и в Линуксе. С XSD платформа сама работать не умеет. Veizdem --> Veizdem



Просмотр профиля

Работать с xml можно двумя способами получается - COM и внутренними средствами платформы, а что-то внутреннее по аналогии для COMConnector не придумано? Идиотизм какой-то. В очередной раз убеждаюсь, что проще было вместо 1С самостоятельно что-то написать.

Получается что для Linux только галочку на сайте разработали, а толку от этого никакого нет.

Petre --> Petre



Просмотр профиля Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". Veizdem --> Veizdem



Просмотр профиля
А как мне их применять, чтобы работая в одной ИБ получить данные из другой ИБ, если они обе физически на одной машине лежат на одном сервере БД и одном сервере 1с? Или как мне это применить чтобы выгнать всех из 1С обработкой? Petre --> Petre



Просмотр профиля Не пойму, какие ограничения могут накладывать "если они обе физически на одной машине лежат на одном сервере БД и одном сервере 1с". Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". Veizdem --> Veizdem



Просмотр профиля Не пойму, какие ограничения могут накладывать "если они обе физически на одной машине лежат на одном сервере БД и одном сервере 1с".
Ну в этом случае я спрашивал что мне с этим делать, так как еще ни разу с этим дела не имел. Извините, если не совсем понятно выразился. Vofka --> Vofka



Просмотр профиля Ну в этом случае я спрашивал что мне с этим делать, так как еще ни разу с этим дела не имел. Извините, если не совсем понятно выразился.
Ну так цель озвучьте, пора уже. Вы задали вопрос про COM в Linux - вам сказали, что такого нету. Что вы собираетесь сделать - никому кроме вас из здесь присутствующих неизвестно. Veizdem --> Veizdem



Просмотр профиля Ну так цель озвучьте, пора уже. Вы задали вопрос про COM в Linux - вам сказали, что такого нету. Что вы собираетесь сделать - никому кроме вас из здесь присутствующих неизвестно.
Так цель же вот она - как мне организовать обмен данными между двумя разными базами и как делать выброс всех пользователей, включая зависшие сеансы? Vofka --> Vofka



Просмотр профиля как мне организовать обмен данными между двумя разными базами

XML-ем делайте, либо любым форматом на свое усмотрение, в чем проблема? Так же, как выше писали - веб сервисы.

как делать выброс всех пользователей, включая зависшие сеансы?
Где-то (на диске ИТС кажется) встречал программный java интерфейс для управления сервером 1С. Вот видимо для счастливых обладателей Линукса его и сделали, чтобы через него можно было программно работать с сервером 1С. Veizdem --> Veizdem



Просмотр профиля Где-то (на диске ИТС кажется) встречал программный java интерфейс для управления сервером 1С. Вот видимо для счастливых обладателей Линукса его и сделали, чтобы через него можно было программно работать с сервером 1С.

Порылся на диске, нашел, да есть такая штука на Java, только вот я два дня промучился и не смог даже их пример работать заставить, он мне ошибку "отказ в соединении" выкидывает. И вот как с этим работать?

И ладно бы я не знал что такое Java, но я на ней не один проект сделать успел, до того как пересесть за 1С.

Может быть где-то есть какая-нибудь детальная информация как это все должно работать? JavaDoc предоставляемый в комплекте не дает полного описания того, как это все должно работать.

Vofka --> Vofka



Просмотр профиля

А в linux'е что-то типа windows'кой COM-технологии есть.

А что тебе от нее собственно надо в Linux. Как ты ее в обще понимаешь. Ежу ясно, что никто тут (в Linux) писать компоненты для VB не будет :-) А в остальном, пиши свои интерфейсы, фабрики, чем ником тебе. Вообще собственно что нужно то, а то вопрос не совсем понятен


Не знаю как ком ком+ в Линуксе поддерживаются довольно неплохо и даже доки на русском есть. И книги на рынке. если мне неизменяет память то ето что-то близкое k RPC. Под рукой ничего более подробного нет.

Понятно. Но все же, какие именно задачи он (COM) должен решать в Linux. Ведь в большинстве случаев не обязательно лезть в дебри сложной технологии, биться как говориться в лоб, когда можно найти другое решение, причем не худшее. Я понимаю, что в Linux важен сам принцип COM - отделение реализации от интерфейса. А вот с COM+ . Пока не смотрел что за чудо, нет времени и обхожусь без него вполне, но позже обязательно взгляну, поэтому тут мне сказать нечего

Есть например Bonobo,
есть еще несколько попыток сделать подобное, каждая реализация используется своим целевым пользователе,
будь то разработчики KDE, GNOME или RH.

Может, я не правильно вопрос поставил. Или, я неправильно понимаю суть COM-технологии. Короче говоря, меня интересует возможность закатать объект в разделяемую библиотеку.

Работет (без-воз-мездно, то есть за-даром) как под M$, так и под Linuxом

Ну тогда всего сказанного вполне достаточно.Пиши интерфейсы и через них работай с объектами.

>закатать объект в разделяемую библиотеку

Смотри, как это делаем мы:

- получаем из него "разделяемую библиотеку"
Tetris.so для Linux
Tetris.dll для M$
которую можно динамически подгружать

- эта "разделяемая библиотека" содержит всю
информацию об обьекте (чем не COM) Tetris :
все methods, data members etc.

Читайте также: