Объект com что это за программа

Component Object Model

Шаблон:Нет сносок COM ( Шаблон:Lang-en — объектная модель компонентов; произносится как [ком]) — это Microsoft, предназначенный для создания объектно-ориентированного программирования . Стандарт COM мог бы быть универсальным и платформо-независимым, но закрепился в основном на операционных системах семейства Microsoft Windows . В современных версиях Windows COM используется очень широко. На основе COM были реализованы технологии: ActiveX , DCOM, COM+, DirectX, а также XPCOM .

  • 1 История COM
  • 1.1 Путаница в названиях
  • 3.1 DCOM
  • 3.2 COM+
  • 3.3 .NET и будущее COM
  • 3.4 DCOM через интернет и решение проблемы XP SP2
  • 3.5 OPC
  • 3.6 OLE

История COM [ ]

Стандарт COM был разработан в OLE . Технология OLE 1.0 уже позволяла создавать т. н. « Шаблон:Lang-en ): например, в пакете Microsoft Office эта технология позволяла включать диаграммы Microsoft Excel в документы Microsoft Word.

Пропаганда призывает ответить за Энгельс. ВСУ наступают под Луганском. Яшина этапировали | УТРО

Путаница в названиях [ ]

Некоторая путаница между понятиями OLE и ActiveX сохраняется и до сих пор, но речь идёт об одних и тех же COM-технологиях. Причём иногда даже путают понятия OLE и COM. Так, внедряемые OLE-объекты иногда называют COM-объектами, а OLE-контейнеры — COM-контейнерами, и т. п.

Принципы работы COM [ ]

Технологии, основанные на стандарте COM [ ]

DCOM [ ]

Основная статья: DCOM

Выпущенная в Шаблон:Lang-en — распределённая COM) основана на технологии CORBA .

Как DCOM, так и CORBA решают задачу вызова метода объекта, расположенного на другой машине, а также передачу ссылки на объект с одной машины на другую.

Сетевой уровень DCOM называется ORPC (Object RPC) и является объектно-ориентированным расширением DCE RPC.

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

COM+ [ ]

Microsoft Transaction Server был включен в Option Pack для Windows NT4 еще в 1997 году.

MTS/COM+ использовался внутри ряда версий веб-сервера MS ISAPI , так и скриптовых по технологии ASP (сама asp.dll есть ISAPI-приложение).

COM+ объединяет компоненты в так называемые приложения COM+, что упрощает администрирование и обслуживание компонентов. Безопасность и производительность — основные направления усовершенствований COM+. Некоторые идеи, заложенные в основу COM+, были также реализованы в Microsoft .NET .

.NET и будущее COM [ ]

В Microsoft .NET , которая на сегодняшний день объявлена Microsoft рекомендуемой основой для создания приложений и компонентов под Windows. По этой причине в .NET включены и средства, позволяющие обращаться к компонентам COM из приложений .NET , и наоборот. По словам представителей Майкрософт, COM (точнее, COM+) и .NET являются отлично взаимодополняющими технологиями.

DCOM через интернет и решение проблемы XP SP2 [ ]

В 2009 году DComLab опубликовал коммерческий продукт ComBridge. При использовании ComBridge для работы по DCOM через интернет не требуется CIS, не используется 135 порт, в локальной сети не требуются настройки dcomcnfg. ComBridge встраивается в транспортный уровень DCOM, полностью выделяя весь трафик созданного объекта и всех полученных из него объектов в отдельный поток.

Передача параметров в функцию по указателю c++. Передача указателя в функцию си. Урок #48

OPC [ ]

Технология часто критикуется за неоправданную сложность, конкретно:

  • необходимость использования двух языков программирования (.idl для описания интерфейсов и, обычно, C++ для написания реализаций). Необходимость возникает только при создании собственных интерфейсов, и не возникает в случае, если разработчик ограничил себя использованием готовых интерфейсов.
  • необходимость «прокладочного» кода (в его роли обычно выступает ATL) для того, чтобы создать COM-объект на базе С++ класса. Хотя этот код и тривиален в использовании для опытного человека, он не очень прост для начинающих. Как и в предыдущем пункте, эта проблема возникает только при написании собственных классов и не возникает при одном лишь использовании стандартных чужих классов (для которых Microsoft разработал библиотеку смарт-пойнтеров — comdef.h, _com_ptr_t, эта библиотека делает использование COM-объектов тривиальным).
  • необходимость регистрации компонент в реестре операционной системы, причем при этом в качестве идентификатора класса используется нечитаемый человеком Objective C и Cocoa .

Ссылки [ ]

  • Раздел разработки Win32 и COM в библиотеке MSDN Раздел COM в библиотеке MSDN Раздел COM+ в библиотеке MSDN Раздел DCOM в библиотеке MSDN раздел COM/DCOM/COM+ на сайте RSDN Концепция COM Использование COM объектов без регистрации в реестре Программирование COM-интерфейсов Подборка статей о COM Литература [ ]

Компоненты Microsoft Windows Основные

Источник: microsoft.fandom.com

Работа с COM-объектами

XYZ School

проектировалась с целью дать возможность создавать компоненты на любом языке/платформе, обладающем поддержкой этой модели, и использовать их в любом языке/платформе (другом), так же обладающем поддержкой COM. Платформа .NET не исключение и позволяет легко использовать сторонние COM-объекты и экспортировать типы .NET в виде COM-объектов.

Суть организации взаимодействий с COM-объектами та же, что и при использовании механизма P/Invoke: вы объявляете управляемое представление COM-объекта, а среда выполнения CLR создает объект-обертку, реализующий маршалинг. Существует две разновидности оберток: обертка, вызываемая средой выполнения (Runtime Callable Wrapper, RCW), которая позволяет управляемому коду использовать COM-объекты:

Управляемый клиент вызывает неуправляемый COM-объект

и обертка, вызываемая COM-объектами (COM Callable Wrapper, CCW), дающая возможность COM-объектам вызывать управляемый код:

Неуправляемый клиент вызывает управляемый COM-объект

Сторонние COM-объекты часто поставляются вместе с основной сборкой взаимодействий (Primary Interop Assembly, PIA), содержащей определения, одобренные производителем, подписанной и устанавливаемой в глобальный кеш сборок (Global Assembly Cache, GAC). В противном случае можно воспользоваться инструментом tlbimp.exe, являющийся частью Windows SDK, который автоматически генерирует сборку взаимодействий, опираясь на информацию, содержащуюся в библиотеке типов.

При взаимодействиях с COM-объектами повторно используется инфраструктура маршалинга параметров механизма P/Invoke, но с иными умолчаниями (например, по умолчанию строки преобразуются в тип BSTR), поэтому все советы, что были даны в предыдущей статье относительно механизма P/Invoke, также применимы и здесь.

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

Управление жизненным циклом

Получая ссылку на COM-объект в .NET, вы фактически получаете ссылку на объект-обертку RCW. Обертка RCW всегда хранит единственную ссылку на COM-объект и для каждого COM-объекта создается только один экземпляр объекта-обертки RCW. Обертка RCW поддерживает собственный счетчик ссылок, не связанный со счетчиком ссылок COM-объекта. Значение этого счетчика ссылок обычно равно 1, но может быть больше, при участии в маршалинге большего числа интерфейсов или когда к одному и тому же интерфейсу обращается несколько потоков выполнения.

Как правило, когда удаляется последняя управляемая ссылка на RCW, в следующем же цикле сборки мусора в поколении, где находится обертка RCW, вызывается финализатор RCW, который уменьшает счетчик ссылок в COM-объекте (который имеет значение 1) вызовом метода Release() интерфейса IUnknown этого COM-объекта. COM-объект тут же уничтожает себя и освобождает занимаемую им память.

Поскольку сборщик мусора в .NET запускается в непредсказуемые моменты времени и не знает о блоках неуправляемой памяти, выделенных при создании оберток RCW для COM-объектов, он не может ускорить сборку мусора, вследствие чего объем занимаемой памяти может оказаться очень большим.

При необходимости можно вызвать метод Marshal.ReleaseComObject(), чтобы явно освободить объект. Каждый вызов уменьшает счетчик ссылок в RCW и когда он достигнет нуля, автоматически уменьшается счетчик ссылок в соответствующем COM-объекте (точно так же, как при вызове фииализатора RCW). После вызова метода Marshal.ReleaseComObject() нельзя использовать обертку RCW.

Если после вызова счетчик ссылок RCW может оказаться больше нуля, метод Marshal.ReleaseComObject() следует вызывать в цикле, пока он не вернет нулевое значение. Лучше всего вызывать Marshal.ReleaseComObject() внутри блока finally, чтобы гарантировать освобождение COM-объекта, даже если где-то между созданием его экземпляра и освобождением возникнет исключение.

Читайте также:
Маруся что это за программа и нужна

Маршалинг через границы подразделений

Модель COM реализует собственные механизмы синхронизации потоков выполнения для поддержки вызовов между разными потоками, которые могут использоваться даже при работе с объектами, изначально не предназначенными для использования в многопоточной среде. Эти механизмы могут снижать производительность при неправильном их применении. Хотя эта проблема не имеет прямого отношения к взаимодействиям с COM-объектами из .NET, тем не менее, ее стоит обсудить, потому что с ней часто сталкиваются на практике, вероятно потому, что разработчики, привыкшие к типичным приемам синхронизации в .NET могут не знать, что конкретно происходит под покровом COM-объектов.

Модель COM связывает объекты и потоки выполнения с подразделениями (apartments), служащими границами, через которые модель COM выполняет вызовы. Всего имеется несколько типов подразделений:

Однопоточные подразделения (Single-Threaded Apartment, STA)

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

Многопоточные подразделения (Multi-Threaded Apartment, МТА)

В каждом подразделении может иметься любое количество потоков выполнения и объектов, но в процессе может быть только одно подразделение МТА. Этот тип используется в .NET по умолчанию.

Потоконезависимые подразделения (Neutral-Threaded Apartment, NTA)

Содержат объекты, но не потоки. В процессе может быть только одно подразделение NTA.

Связывание потока выполнения с подразделением происходит при вызове CoInitialize или CoInitializeEx для инициализации COM-объекта в этом потоке. Функция CoInitialize связывает поток с новым подразделением STA, а функция CoInitializeEx позволяет указать тип подразделения, STA или МТА.

В .NET вам не придется вызывать эти функции непосредственно, вместо этого достаточно добавить атрибут STAThread или MTAThread к точке входа в поток (методу Main). При желании можно также вызвать метод Thread.SetApartmentState() или установить значение в свойстве Thread.ApartmentState перед запуском потока выполнения. Если не указано иное, .NET инициализирует потоки (включая главный поток приложения) как принадлежащие подразделению МТА.

Связывание COM-объектов с подразделениями выполняется, исходя из параметра ThreadingModel в реестре, который может иметь следующие значения:

  • Single — объект по умолчанию помещается в подразделение STA.
  • Apartment — объект должен быть помещен в любое подразделение STA, и только потоку из этого подразделения будет позволено вызывать объект непосредственно. Другие экземпляры могут помещаться в другие подразделения STA.
  • Free — объект помещается в подразделение МТА. Этот объект может вызываться непосредственно и одновременно из любого количества потоков в подразделении МТА. Объект должен обеспечивать поддержку использования в многопоточной среде.
  • Both — объект помещается в подразделение создавшей его программы (STA или МТА). По сути, после создания он становится STA- или МТА-подобным объектом.
  • Neutral — объект помещается в потоконезависимое подразделение и не требует маршалинга. Это — наиболее эффективный режим.

На рисунке ниже изображена схема взаимоотношений между подразделениями, потоками и объектами:

Деление процесса на подразделения COM

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

В процессе маршалинга вызов функции (включая параметры) преобразуется в сообщение, которое будет послано в очередь принимающего подразделения STA. Для объектов STA очередь реализуется как скрытое окно, оконная процедура которого принимает сообщения и передает COM-объекту с помощью заглушки (stub). При таком подходе COM-объекты в подразделении STA COM всегда вызываются в одном и том же потоке выполнения, благодаря чему обеспечивается безопасность при работе в многопоточном окружении.

Если вызывающее подразделение не совместимо с подразделением COM-объекта, происходит переключение потока и выполняется маршалинг параметра между потоками.

Чтобы избежать падения производительности из-за маршалинга между потоками, старайтесь обеспечить соответствие между подразделением COM-объекта и подразделением создающего его потока. Создавайте и используйте COM-объекты STA в потоках из подразделения STA, а COM объекты из подразделения МТА — в потоках МТА. COM-объекты, помеченные, как поддерживающие оба типа подразделений, могут свободно использоваться из любых потоков выполнения без лишних накладных расходов.

Вызов объектов STA из ASP.NET

По умолчанию среда ASP.NET выполняет страницы в потоках МТА. Если из этих страниц вызываются объекты, находящиеся в подразделениях STA, в дело вступает механизм маршалинга. Если основная масса используемых объектов принадлежит подразделениям STA, это приведет к деградации производительности. Эту проблему можно ликвидировать, пометив страницы атрибутом AspCompat, как показано ниже:

Обратите внимание, что конструкторы страниц все еще выполняются в потоке выполнения МТА, поэтому создание объектов STA следует выполнять в обработчиках событий Page_Load и Page_Init.

Импортирование библиотек типов и Code Access Security

Механизм Code Access Security выполняет те же проверки безопасности, что и P/Invoke. Вы можете добавлять ключ /unsafe при вызове утилиты tlbimp.exe, которая будет добавлять атрибут SuppressUnmanagedCodeSecurityAttribute к сгенерированным типам. Используйте эту возможность только в системах, пользующихся у вас безусловным доверием, так как она может порождать проблемы безопасности.

NoPIA

До выхода версии .NET Framework 4.0 приходилось вместе с приложением распространять сборки взаимодействий или основные сборки взаимодействий (Primary Interop Assemblies, PIA). Эти сборки обычно получались очень большими (даже в сравнении с кодом, использующим их) и как правило не входят в установочный комплект COM-компонентов; вместо этого их необходимо устанавливать отдельно, потому что сами они не требуются для работы самих COM-объектов. Другая причина, почему сборки PIA не включаются в установочные комплекты, состоит в том, что они устанавливаются в глобальный кеш сборок (GAC). Это вводит зависимость от .NET Framework в иначе полностью независимые приложения.

Начиная с версии .NET Framework 4.0, компиляторы C# и VB.NET могут проверить, какие COM-интерфейсы и методы используются в коде, и скопировать и встроить в вызывающую сборку только действительно необходимые определения, уменьшая размер кода и избавляя от необходимости распространять библиотеки PIA. В Microsoft эта особенность была названа NoPIA. Она действует как в отношении основных сборок взаимодействий, так и в отношении сборок взаимодействий в целом.

Сборки PIA обладают одной важной особенностью, которая называется эквивалентностью типов. Так как они имеют строгое именование и помещаются в глобальный кеш сборок, различные управляемые компоненты могут обмениваться обертками RCW и с точки зрения .NET они будут иметь эквивалентные типы. Напротив, сборки взаимодействий, сгенерированные с помощью tlbimp.exe, не обладают такой особенностью, так как каждый компонент в этом случае получит собственную, отдельную от других, сборку взаимодействий. С появлением поддержки особенности NoPIA отпала необходимость в строгом именовании сборок, и в Microsoft было предложено решение, позволяющее интерпретировать обертки RCW из других сборок, как принадлежащие тому же типу, если интерфейсы имеют одинаковый идентификатор GUID.

Чтобы включить поддержку NoPIA, выберите пункт Properties в контекстном меню Visual Studio после щелчка правой кнопкой мыши на сборке взаимодействий в разделе References, и установите параметр Embed Interop Types (Внедрять типы взаимодействий) в значение True:

Включение поддержки NoPIA в свойствах ссылки на сборку взаимодействий

Исключения

Большинство методов COM-интерфейсов сообщают об успехе или неудаче, возвращая значение типа HRESULT. Отрицательные значения HRESULT (с установленным старшим битом) сообщают об ошибке, а ноль (S_OK) или положительные значения — об успехе. Кроме того, COM-объект может возвращать дополнительную информацию об ошибке при вызове функции SetErrorInfo, передавая объект IErrorInfo, созданный вызовом CreateErrorInfo.

При вызове COM-метода через механизм взаимодействий с COM, заглушка маршалера преобразует значение HRESULT в управляемое исключение, согласно самому значению HRESULT и данным, содержащимся в объекте IErrorInfo. Поскольку возбуждение исключения является достаточно дорогостоящей операцией, функции COM-объекта, которые часто терпят неудачу, могут отрицательно сказываться на производительности. Вы можете подавить автоматическое преобразование исключений, пометив методы атрибутом PreserveSigAttribute. При этом вам придется изменить управляемую сигнатуру, как возвращающую значение типа int, в результате чего параметр retval станет параметром out.

Читайте также:
Launchy что это за программа

Источник: professorweb.ru

Многокомпонентная модель объектов (COM)

Одним из ключевых достижений Windows по праву считается многокомпонентная модель объектов (Component Object Model, COM). Модель COM описывает способ взаимодействия программ любого типа. Программа-сервер (сервер COM) предоставляет в распоряжение окружающих собственные службы, а программа-клиент (клиент COM) пользуется услугами доступных служб.

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

С точки зрения стороннего наблюдателя создаваемый средствами COM программный компонент представляет собой черный ящик, обладающий следующими характеристиками:

1. Легкость подключения к операционной системе.

3. Простота интеграции в состав программного обеспечения.

4. Универсальный способ обращения к методам и свойствам из любого современного языка программирования.

Корпорация Microsoft стандартизировала как способ представления COM — объекта в памяти компьютера, так и особенности идентификации методов и свойств этого объекта. Поэтому в официальной документации Microsoft (MSDN) при описании COM неоднократно упоминается о том, что COM-модель соответствует бинарному (другими словами, универсальному) стандарту.

На первый взгляд черный ящик COM весьма похож библиотеку DLL.

Как и COM, DLL позволяет многократно использовать свой код, легко подключаться к ОС и интегрироваться в программное обеспечение. Но динамически подключаемая библиотека не в состоянии гарантировать, что экспортируемые ею функции без каких-либо ограничений могут быть вызваны средствами любого другого языка программирования. Кроме того, при работе c DLL мы сталкиваемся с рядом ограничений, связанных с местом ее размещения: библиотека должна располагаться либо в строгом перечне каталогов, либо обязательно прописываться в системных путях. Еще более сложная задача — загрузка DLL с другого компьютера. В отличие от DLL, модель COM обеспечивает универсальный способ загрузки своих объектов независимо от места их размещения.

С первых шагов изучения COM важно понять, что это не очередной объектно-ориентированный язык программирования со своим синтаксисом, семантикой и деталями реализации. Правильнее говорить о COM как о стандарте, определяющем модель взаимодействия между объектами.

В интересах клиентских и серверных приложений COM-модели активно трудится библиотека COM (COM Library). Физически библиотека COM представляет собой набор исполняемых файлов и динамически подключаемых библиотек. Она способна:

1. Предоставлять услуги некоторого набора функций API, облегчающих разработку приложений COM. Например, для клиентских приложений предназначены методы, создающие объекты. Для приложений серверов в библиотеке предусмотрены средства демонстрации их COM-объектов.

2. Генерировать уникальный идентификатор объекта, осуществлять поиск требуемого объекта по его идентификатору.

3. Производить вызов удаленных процедур, если сервер COM размещен на другом компьютере.

4. Управлять распределением памяти в интересах взаимодействующих процессов и контролировать освобождение памяти.

По существующей договоренности имена всех методов Win32 API библиотеки COM начинаются с префикса «Co», например CoCreateGuid(), CoCreateInstance(), CoUn- initialize() и т. п.

4.3.1.2. Элементы COM-приложения

Разработчик стандартного COM-приложения в любом случае столкнется с двумя его элементами:

Сервер COM представляет собой отдельный модуль, реализованный в виде самостоятельного исполняемого EXE-файла или файла динамической библиотеки DLL.

Моделью COM предусмотрены две разновидности сервера: внутренний и внешний.

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

В отличие от внутреннего сервера, внешний COM-сервер выполняется в своем собственном адресном пространстве. Допускается, чтобы внешний сервер порождался процессом, выполняющимся на другом компьютере. В этом случае вернее говорить не просто о COM, а о распределенной COM (Distributed COM, DCOM). При этом передача вызовов между двумя машинами осуществляется с помощью механизма удаленного вызова процедур RPC (Remote Procedure Call).

Рассмотрим классы VCL, поставленные на службу технологии COM.

В состав COM-сервера как минимум входят:

1. Один — единственный экземпляр класса TcomServer, инкапсулирующий сам COM-сервер. Доступ к этому объекту обеспечивает создаваемая при запуске сервера глобальная переменная ComServer.

2. Описание COM-объекта (или нескольких объектов), прототипом которого служит класс TComObject.

3.Фабрика класса (по одной на каждый тип COM-объекта). Основой фабрики класса служит класс TComObjectFactory. Единственная задача фабрики класса заключается в создании других объектов – экземпляров класса TComObject.

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

В COM-модели процессом создания нового объекта ведает не среда программирования и даже не сам объект, а третья (в какой-то степени нейтральная) сторона – фабрика класса(class factories). Именно фабрика целиком и полностью отвечает за распределение памяти для будущего COM-объекта, и при этом, как бы это нам не показалось парадоксальным, о подробностях построения этого объекта не имеет ни малейшего представления.

Для каждого отдельного COM-класса предназначена отдельная фабрика.

Для создания нового экземпляра класса фабрика пользуется шаблоном класса, или фабричным образцом(factory pattern).

Фабричный образец — это особый класс, применяемый для создания экземпляра другого класса.

Благодаря «фабричному» подходу процесс создания нового объекта отделяется от особенностей его реализации.

Обслуживанием фабрик ведает менеджер фабрик — объект класса TComClass — Manager. Экземпляр менеджера создается автоматически и доступен в приложении COM — сервера благодаря глобальной переменной ComClassManager.

Клиент COM пользуется услугами сервера, но не имеет ни малейшего понятия об особенностях его реализации. Доступ клиента к службам внедренного в сервер COM-объекта осуществляется только через интерфейсы этого объекта; это ключевая особенность всей COM-модели. Получив указатель на интерфейс, клиентское приложение приобретает право вызова методов объекта.

4.3.1.3. COM – объект

В основе многокомпонентной модели лежит понятие COM-объекта.

Физически COM-объект представляет собой совокупность данных и методов, управляющих этими данными. Структура COM-объекта существенно отличается от кнопок и строк ввода, привычных нам по библиотеке VCL. Ключевое отличие COM от знакомого нам объекта Delphi в том, каким образом COM-объект предоставляет доступ к своим данным.

Структура COM-объекта материализует идею сказки о Кощее Бессмертном. Помните: смерть в игле, игла в яйце, яйцо в утке, утка в зайце, заяц в сундуке, сундук на дубе. Неизвестно, читали в Microsoft русские народные сказки или нет, но проектируя COM-объект, программисты корпорации уверенно пошли по проторенному Кощеем пути — прямого доступа к данным COM- объекта извне в принципе не существует. Каждое поле объекта скрыто в его недрах и может обслуживаться только методами COM-объекта. Методы объекта также особой коммуникабельностью не отличаются; они упакованы так глубоко, что доступны лишь через свои указатели.

Рис. 6. Модель COM-объекта

И это еще не все. В свою очередь указатели на методы хранятся в специальных таблицах адресов функций — в так называемых виртуальных таблицах объекта (virtual tables). Описание каждой из таких таблиц называют интерфейсом(interface). Методы интерфейса можно вызывать аналогично методам любого объекта Delphi.

Сколько у объекта таблиц, столько у него интерфейсов. В свете вышесказанного не стоит удивляться, что непосредственно к интерфейсу (указателю на виртуальную таблицу адресов методов) обратиться нельзя — вместо этого можно работать лишь с указателем на интерфейс; это единственное, что доступно извне COM-объекта. На рис. 6 представлена модель COM-объекта.

Получив доступ к обязательно присутствующему интерфейсу IUnknown, программа или любой другой объект сразу может обратиться к функции QueryInterface() и узнать обо всех остальных имеющихся у этого объекта интерфейсах. На схемах интерфейс IUnknown изображается в верхней части объекта (рис. 7).

Рис. 7. Представление COM-объекта в виде схемы

В среде программирования Delphi в основу COM-объекта положен класс TCOMObject. Его интерфейсная часть создается на базе опорного для всех интерфейсных классов IInterface.

По своей сути интерфейс — это договор между COM-объектом и клиентским приложением, в котором COM-объект гарантирует клиенту предоставление некоторых услуг. Услуги — это определенные в интерфейсе методы. Но хотя интерфейс и имеет право объявлять заголовки методов, но ни один из его методов не имеет описания. Это объясняется тем, что у интерфейса нет раздела реализации, он лишь декларирует названия методов и перечень параметров. Клиенты могут получить доступ к данным COM-объекта только с помощью указателя на интерфейс.

Читайте также:
Что за программа exon

Другим значимым аспектом интерфейса является то, что если COM-объект заявляет о существовании у него определенного интерфейса, то объявленный интерфейс должен обязательно поддерживаться внутренними методами объекта и возвращать какие-либо значения, пусть хотя бы банальное сообщение об ошибке.

Интерфейсы могут наследоваться — дочерний интерфейс должен включать все методы своего предка. Все существующие интерфейсы наследуются от базового интерфейса IUnknown.

Следует указать еще на два правила, соблюдение которых необходимо при проектировании COM-объекта:

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

В рамках отдельной системы каждый интерфейс должен иметь уникальный идентификатор GUID и название, начинающееся с символа «I».

4.3.1.5. Порядок вызова сервера клиентским приложением

Для того чтобы модель COM начала функционировать, клиентское приложение должно отправить запрос на услуги COM-сервера. Каким образом клиентское приложение получит доступ к интересующему его COM-серверу? В особенности если COM-клиент работает в другом адресном пространстве? Ответ на эти вопросы надо искать в системном реестре Windows.

ё

Рис. 8. Порядок обращения клиента к серверу

Во время установки COM-приложения в реестр операционной системы вносится информация об имеющихся в наличии COM-объектах. В первую очередь это идентификатор, однозначно определяющий класс объекта (Class Identifier, CLSID). Идентификаторы классов хранятся в следующей ветви реестра Windows:

Аналогичные данные можно найти и в ветви HKEY_CLASSES_ROOT. Кроме того, в реестре хранится имя модуля, содержащего сервер, или сетевой адрес, если сервер выполняется на другой машине.

Идентификатор CLSID — это разновидность уже встречавшихся ранее глобальных уникальных идентификаторов (Global Unique Identifier, GUID). Это уникальное 128- битное число, применяемое для идентификации интерфейсов, объектов и классов. Уникальность достигается за счет использования оригинального алгоритма генерации числа, обеспечиваемого функцией Win32 API CoCreateGuid().

В процессе запуска COM-объекта непосредственное участие принимает системная библиотека COM. На рис. 8 схематично представлена последовательность действий клиента, библиотеки и сервера COM при создании первого экземпляра COM-объекта.

Источник: studopedia.ru

COM соединение в 1С 8.3

Анна Викулина

Одним из способов перенести данные из одной конфигурации 1С в другую является программное подключение с помощью COM. Многие компании используют несколько различных баз, между которыми должны быть определенные связи и зависимости. Если необходимо не только перенести данные, но и выполнить определенную обработку данных, то COM соединение будет оптимальным механизмом. Умение анализировать данные из другой базы 1С пригодиться любому разработчику.

Подключаемся через COM к базе 1С

Для реализации COM соединения в 1С используется специальный механизм под названием COMConnector. Этот объект устанавливается вместе с платформой и применяется для связи информационных баз. Следует учесть, что для версий 8.2 и 8.3 используются разные по наименованию объекты – «V82.COMConnector» и «V83.COMConnector» соответственно.

Помните, что на время COM соединения к базе тратиться лицензия – не стоит увлекаться одновременным выполнением нескольких подключений. Особенно это важно для организаций, у которых количество лицензий ограничено. Решиться этот вопрос может при помощи регламентных заданий, выполняющихся во время отсутствия активных подключений пользователей к информационной базе.

Чтобы иметь возможность подключиться к другой базе и запросить нужную информацию вы должны знать следующие данные:

  1. Какого она типа – файловая или клиент-серверная;
  2. Где она располагается;
  3. Под каким именем и паролем в нее можно зайти;
  4. Какие данные вас интересуют.

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

ПараметрыПодключенияФайловойИБ = «Filе=»»Путь_к_базе»»; Usr=»»Имя_пользователя»»;Pwd=»»Пароль»»»; ПараметрыПодключенияКлиентСервернойИБ = «Srvr=»»Имя_Сервера»»; Ref=»»Имя_базы»»; Usr=»»Имя_пользователя»»; Pwd=»»Пароль»»»;

Функция подключения проста и не должна вызвать вопросов, если все параметры указаны верно. Для ускорения отладки и анализа возможных ошибок лучше заключить подключение в конструкцию «Попытка». Возвращать функция будет значение типа «COM объект», с которым и предстоит работать, получая нужные данные.

Filе=»»Е:базы 1сЕRР»»; Usr=»»Администратор»»;Pwd=»»1″»»; V83COMCon= Новый СОMОбъект(«V83.COMConnector»); Попытка Возврат V83COMCon.Connect(ПараметрыПодключенияИБ); Исключение Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; КонецФункции

Через COM соединение вы можете не только выбирать данные, но и добавлять их в базу, к которой подключаетесь. Помните, что передавать через COM объект мы можем 4 примитивных типа данных. Другие типы придется задавать с помощью встроенных в платформу функций поиска. Учтите, что глобальные функции платформы вызываются тоже через COM-соединение.

Получаем данные из базы 1С

После того как получили нужный объект, необходимо прочитать данные из другой базы. Для этого мы применяем запрос через COM соединение в 1С 8.3 с помощью полученного значения типа «COM объект» из функции. Важно сначала подключиться к базе, а затем уже выполнять запрос. Выполнение происходит через метод NewObject с указанием в качестве параметра типа объекта в строковом виде – «Запрос».

Если ТипЗнч(Соединение) <> Тип(«Неопределено») Тогда ЗапросБПЗО = Соединение.NewObject(«Запрос»); ЗапросБПЗО.Текст = «ВЫБРАТЬ первые 15 | СправочникПольз.Наименование КАК Наименование |ИЗ | Справочник.пользователи КАК СправочникПольз»; Выборка = ЗапросБПЗО.Выполнить().выбрать(); Пока Выборка.следующий() цикл Сообщить(Выборка.Номер); КонецЦикла; КонецЕсли; КонецПроцедуры

К примеру, чтобы получить информацию о пользователях определенного подразделения, зададим условие в запрос через параметры. Один параметр будет простого типа – строка, а подразделение – ссылкой элемента справочника «Структура предприятия». Результат запроса является таблицей с перечисленными полями того типа, какого они существуют в базе, к которой произошло COM соединение. Если необходимо их преобразовать в другие типы – воспользуйтесь стандартными функциями платформы:

ЗапросБПЗО = Соединение.NewObject(«Запрос»); ЗапросБПЗО.Текст = «ВЫБРАТЬ первые 15 | СправочникПольз.Наименование КАК Наименование |ИЗ | Справочник.Пользователи КАК СправочникПольз I ГДЕ | СправочникПольз.Подразделение = «%»» + «%»»»; ЗапросБПЗО.УстановитьПараметр(«НужноеПодразделение»,Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду(«00-000023»)); ЗапросБПЗО.УстановитьПараметр(«НужноеИмя»,»Екатерина»); Выборка = ЗапросБПЗО.Выполнить().выбрать(); Пока Выборка.следующий() цикл Сообщить(Выборка.Наименование); КонецЦикла;

Если нужно передать в базу массив для отбора по нескольким параметрам, например, подразделениям, тоже используется команда NewObject. Аналогично можно передавать список или таблицу значений, заполняя их элементами другой базы через соединение. Для поиска вам доступны все существующие методы объектов и механизмов платформы.

ЗапросБПЗО = Соединение.NewObject.(«Запрос»); ЗапросБПЗО.Текст = «ВЫБРАТЬ первые 15 | СправочникПольз.Наименование КАК Наименование | ИЗ | Справочник.Пользователи КАК СправочникПольз I ГДЕ | СправочникПольз.Подразделение В («%»» + «%»»»; МассивПодразделений = Соединение.NewObject(«Массив»); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду(«00-000023»)); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду(«00-000038»)); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду(«00-000046»)); ЗапросБПЗО.УстановитьПараметр(«НужноеПодразделение», МассивПодразделений); ЗапросБПЗО.УстановитьПараметр(«НужноеИмя»,»Екатерина»); Выборка = ЗапросБПЗО.Выполнить().выбрать(); Пока Выборка.следующий() цикл Сообщить(Выборка.Наименование); КонецЦикла;

При переносе документов или элементов справочников всегда возникает вопрос о контроле переноса определенного объекта. С помощью COM соединений можно решить подобные проблемы через уникальный идентификатор. Нужно найти объект в подключаемой базе по идентификатору из текущей ИБ с помощью функции «ПолучитьСсылку», используя идентификатор в виде строки. Если такового не нашлось, вы можете создать его с помощью COM соединения.

СтрИдент = Строка(Справочники.Пользователи.НайтиПоКоду(«00-0000313»).УникальныйИдентификатор()); Если НЕ ЗначениеЗаполнено(Соединение.Справочники.Пользователи.ПолучитьСсылку(Соединение.NewObject(«УникальныйИдентификатор», СтрИдент))) тогда НовыйПользователь = Соединение.Справочники.Пользователи.СоздатьЭлемент(); НовыйПользователь.Наименование = Справочники.Пользователи.НайтиПоКоду(«00-0000313»).Наименование; НовыйПользователь.ФизическоеЛицо = Справочники.Пользователи.НайтиПоКоду(«00-0000313»).ФизическоеЛицо; НовыйПользователь.Записать(); КонецЕсли;

Также COM соединение имеет право использовать процедуры и функции из общих модулей 1С с включенным свойством «Внешнее соединение». Кроме этого условия, вызываемая функция или процедура должна быть экспортная и не включать интерактивные действия, выполняемые на сервере. В противоположном случае вы увидите ошибку о недопустимости операции.

Рис.1 Внешнее соединение

Соединение..; ПеременнаяИзФункции = Соединение..;

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

Источник: wiseadvice-it.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru