Вопросы об объектах COM / ActiveX - PullRequest
0 голосов
/ 14 января 2009

У меня хорошие знания по работе с «традиционными» .dll. Также различия между dynamic loading и static loading и т. Д.

Но у меня есть следующие сомнения относительно работы COM-объектов,

  • Обязательно ли регистрировать COM-объекты с помощью regsvr32?
  • Могу ли я иметь две версии зарегистрированных COM object, лежащие в одном / другом каталоге?
  • Помимо того, что он упакован в файл .dll, есть что-то общее между "традиционным" .dll и COM object?

Ответы [ 3 ]

4 голосов
/ 14 января 2009

1) Нет - НЕ нужно регистрировать COM объекты . Для создания новых COM-объектов необходима регистрация. Есть много интерфейсов (COM или собственные функции), которые хотят COM-объект. Их API сообщает вам, какой интерфейс должен поддерживать ваш COM-объект. Поскольку вы передаете существующий COM-объект, им не требуется регистрационная информация для создания вашего COM-объекта. Разновидностью этого сценария является таблица объектов RUnning, в которой вы можете зарегистрировать созданные COM-объекты. Эти объекты также созданы вами, и вам не нужны регистрационные данные.

Пример интерфейса: IQueryCancelAutoplay.

2) Объект COM существует в памяти. Вы, вероятно, думаете о COM class , реализованном в DLL вместе с его фабрикой COM. COM-классы регистрируются по их GUID. Вы можете иметь несколько классов = GUID для каждой DLL, но только одну DLL для каждого класса. Помните, что вызывающая сторона запрашивает у COM экземпляр вашего класса. Какая DLL будет загружена COM, если будут две DLL, реализующие один и тот же класс ?! Конечно, может быть две библиотеки DLL, каждая из которых реализует один класс, где два класса совместно используют некоторые интерфейсы. Они всегда будут использовать IUnknown, например, часто IDispatch, но редко IAcmeCorpFooBarv2

3) COM DLL - это обычная DLL, которая (a) предоставляет некоторые специфичные для COM функции и (b) зарегистрирована, так что фреймворк COM может вызывать LoadLibrary для нее. DLL также может предоставлять другие не-COM-функции. В результате вы можете вызвать LoadLibrary для COM DLL самостоятельно. Иногда это может быть полезно для уменьшения задержки, связанной с созданием вашего первого COM-объекта.

4 голосов
/ 14 января 2009

Да, COM-сборки зарегистрированы, чтобы инфраструктура COM знала, что они существуют. Библиотеки DLL обнаруживаются при регистрации CLSID, а не по пути.

Две версии могут сосуществовать, если они имеют разные имена (очевидно, вы не можете иметь один и тот же именованный файл в папке).

Все COM-объекты реализуют определенные интерфейсы (IUnknown, многие имеют IDispatch). Как COM работает на самом деле является предметом далеко за пределы того, что мы могли бы опубликовать здесь. Вы можете получить такую ​​книгу, как ATL Internals, или просмотреть некоторые онлайн-руководства по COM.

3 голосов
/ 14 января 2009

1) Обязательно зарегистрировать его, если вы не используете то, что называется Reg-Free COM

2) Два COM-объекта с одинаковым сопоставлением CLSID и ProgID не могут быть зарегистрированы.

3) В конечном итоге как традиционные DLL, так и COM-библиотеки содержат машинный код. Если бы это было не для реализации интерфейсов, то в том, как вы пишете свой код, нет большой разницы.

...