Пользовательская реализация COM?

Я надеюсь реализовывать пользовательскую реализацию COM в C++ на платформе типа UNIX, чтобы позволить мне динамично загружаться, и объект ссылки ориентировал код. Я думаю, что это было бы основано на подобном наборе функциональности, которую POSIX предоставляет загрузке, и назовите dll's т.е. dlopen, dlsym и dlclose.

Я понимаю, что общее представление о COM состоит в том, что Вы связываетесь с несколькими функциями т.е. QueryInterface, AddRef и Выпуском в общем dll (Kernel32.dll), который затем позволяет Вам интерфейсам доступа, которые являются просто таблицей указателей функции, инкапсулировавших с указателем на объект, для которого с указателями функции нужно назвать. Эти функции выставляются через IUnknown, из которого необходимо наследоваться прочь.

Таким образом, как это все работает? Существует ли лучший способ динамично связаться и загрузиться к объектно-ориентированному коду? То, как делает наследование от работы dll - делает каждый вызов к базовому классу, должны быть к выставленной функции членства, т.е. частный/защищать/общедоступный просто проигнорирован?

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

8
задан user176168 27 January 2010 в 21:26
поделиться

6 ответов

Я хочу реализовать пользовательскую реализацию COM в C ++ на платформе типа Unix, чтобы позволить мне динамически загружать и ссылку ориентированный объект Code. Я думаю, что это будет основано на аналогичном наборе функциональности, которые POSIX предоставляет загружать и вызов DLL IE DLOPEN, DLSYM и DLCLOSE.

На самом простом уровне, COM реализован с интерфейсами. В C ++, если вам удобно с идеей чистых виртуальных или абстрактных базовых классов, вы уже знаете, как определить интерфейс в C ++

struct IMyInterface {
  void Method1() =0;
  void Method2() =0;
};

COM Runtime предоставляет много дополнительных услуг, которые применяются к среде Windows, но ARN Это действительно необходимо при реализации «Mini» COM в одном приложении в качестве средства для динамической связи с более допуском интерфейса OO, чем традиционно, разрешенным DLOPEN, DLSYM и т. Д.

COM-объектами .dll, .so или. Файлы Dylib в зависимости от вашей платформы. Эти файлы должны экспортировать хотя бы одну функцию, которая стандартизирована: dllgetclassObject

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

Основная идея в том, что это передается указатель на GUID - 16 байтов, которые однозначно присваиваются определенному объекту, и он создает (на основе GUID) и возвращает ICLASSFFORTORY * фабричного объекта.

Затем фабричный объект используется по времени выполнения COM, для создания экземпляров объекта, когда вызывается метод ICLASSFACTORY :: CreateInstance.

Итак, до сих пор у вас есть

  • динамическая библиотека, экспортирующая хотя бы один символ, именуемый «dllgetClassObject» (или некоторый его вариант)
  • метод dllgetClassObject, который проверяет пропущенные в GUID, чтобы увидеть, если и какой объект Запрашивается, а затем выполняет «новую CSomeObjectClassfactoractory»
  • реализацию CSomeObjectClassFactory, которое реализует (вытекает из) ICLASSFFORY и реализует метод CreateInStance для «новых» экземпляров CsupportedObject.
  • CSOMESUPPORTEDOBJECT, который реализует пользовательский или COM-определенный интерфейс, который происходит из Iunknown. Это важно, потому что ICLASSFFORTORY :: CreateInStance передается IID (опять же, уникальный идентификатор 16bybete, определяющий интерфейс на этот раз), что ему нужно будет вправить интерфейс на объекте.

Я понимаю, что общая идея COM состоит в том, что вы ссылаетесь на несколько функций, т.е. queryInterface, addref и release в общем dll (kernel32.dll), которые затем позволяют получать доступ к интерфейсам, которые являются лишь таблицей указателей функций. С указателем на объект, для которого следует вызывать указатели функции. Эти функции выставляются через Iunknown, которые вы должны наследовать.

На самом деле, COM реализован OLE32.dll, который обнажает API «C», называемый CoCreateinStance. Приложение прошло COCREATEINSTANCE GUID, который он смотрит в реестре Windows - который имеет БД GUID -> «Путь к DLL» сопоставлениями. OLE / COM затем загружает (DLOPEN) DLL, вызывает метод dllgetClassObject (dlsym), переходя в GUID, предполагаю, что это успешно, OLE / COM, затем вызывает CreateSStance и возвращает результирующий интерфейс для приложения.

Так как это работает все? Есть ли лучший способ динамически ссылки и загружать на объект ориентированный код? Как наследование от работы DLL - каждый вызов базовому классу должен быть на открытую функцию члена, т. Е. Личное / защищенное / общественность просто игнорируется?

Неявное наследование кода C ++ из DLL / SO / DYLIB работает Экспорт каждого метода в классе как «украшенный» символ. Имя метода украшено классом и типом каждого параметра. Это так же, как символы экспортируются из статических библиотек (.a или файлов IIRC .lib). Статические или динамические библиотеки, «частные, защищенные и т. Д.» Всегда применяются компилятором, разбирая файлы заголовка, никогда не называют линкером.

Я вполне хорошо разбираюсь в Meta-программировании C ++ и шаблона и уже иметь полностью отражающую систему C ++ System I.E, функции членов и глобальные / статические функции, которые используют повышение.

Классы C ++ обычно могут быть экспортированы только из DLL с статическими соединениями - DLL, которые загружаются при нагрузке, а не через DLOPEN во время выполнения. COM позволяет динамически загружать интерфейсы C ++, гарантируя, что все типы данных, используемые в COM, являются либо типы POD, либо являются чистыми виртуальными интерфейсами. Если вы нарушите это правило, определяя интерфейс, который пытается пройти усиление или любой другой тип объекта, который вы быстро попадете в ситуацию, когда компилятор / линкер понадобится больше, чем просто файл заголовка, чтобы выяснить, что происходит Тщательно подготовленные «COM» DLL должны быть статически или неявно связаны, чтобы функционировать.

Другое правило com, никогда не пропускайте владение объектом Accross в границе динамической библиотеки. I.e. Никогда не возвращайте интерфейс или данные из DLL и не требуют его удаления приложения. Всю интерфейсы надо реализовать INKNownown или хотя бы релиз () метод выпуска (), который позволяет объекту выполнить удаление этого.Любые возвращенные типы данных также должны иметь хорошо известный де-распределитель - если у вас есть интерфейс с методом под названием «CREATEBLOB», там, вероятно, должен быть методом Buddy называемый «DELETEBLOB».

3
ответ дан 5 December 2019 в 08:24
поделиться

Чтобы действительно понять, как Com работает, я предлагаю чтение «Essential COM» до Don Box.

3
ответ дан 5 December 2019 в 08:24
поделиться

Основной дизайн COM довольно прост.

  1. Все объекты COM подвергают свою функциональность через один или несколько интерфейсов
  2. , все интерфейсы получают из интерфейса IUKSNOWN, поэтому все интерфейсы имеют QueryInterface, Addref и методы выпуска и первые 3 метода их виртуального Функциональная таблица в известном порядке
  3. Все объекты реализуют INKNOWN
  4. любой интерфейс, который поддерживает объект, может быть запрошен из любого другого интерфейса.
  5. Интерфейсы идентифицируются по глобальным уникальным идентификаторам, это IID GUIDS или CLSIDS, но они все действительно одно и то же. http://en.wikipedia.org/wiki/globally_unique_identifier

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

Осознание Windows Com позволяет зарегистрировано объекты (исходное использование реестра Windows было для COM). При минимальном реестре COM содержит отображение между уникальным GUID для COM-объекта, а библиотека (DLL), которая содержит его код.

Для этого работать. DLL, которые реализуют COM-объекты, должны иметь классную продукцию - точка записи в DLL со стандартным именем, которое можно призвать для создания одного из объектов COM DLL. (На практике Windows COM получает объект ICLASSFFFORTORY из этой точки входа и использует это для создания других объектов COM).

Так что это тур 10 центов, но чтобы понять это, вам нужно прочитать Essential COM до Don Box.

3
ответ дан 5 December 2019 в 08:24
поделиться

Вы можете быть заинтересованы в (еще не еще) Boost.extension Библиотека.

2
ответ дан 5 December 2019 в 08:24
поделиться

Посмотрите документацию CORBA, на System.ComponentModel в sscli, XPCOM частях кодовой базы Mozilla. Мигель де Икаса (Miguel de Icaza) реализовал нечто подобное OLE в GNOME под названием Bonobo, что также может быть полезно.

В зависимости от того, что вы делаете с C++, вы, возможно, захотите взглянуть на фреймворки плагинов для C++, такие как Yehia. Думаю, в Boost также есть нечто похожее.

Правка: пагг кажется лучше поддерживается, чем Yehia на данный момент. Хотя я не пробовал.

3
ответ дан 5 December 2019 в 08:24
поделиться

Пара вещей, чтобы иметь в виду:

  • Сила COM приходит в основном от IDL и компилятора MIDL. Это позволяет Verry Suckint определение объектов и интерфейсов со всей котельной C / C ++, генерированной для вас.

  • COM Регистрация. В Windows идентификаторы класса (CLSID) записываются в реестре, где они связаны с исполняемым. Вы должны предоставить аналогичную функциональность в среде Unix.

  • Вся реализация IUKSNOWN является довольно тривиальным, за исключением QueryInterface , которая работает при реализации в C (I.E. NO RTTI).

  • Целый еще один аспект COM - IDispatch - I.e. Поздний связанный метод вызова и открытия (только для чтения только отражение).

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

6
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: