Кажется, что COM-объекты - это объекты общего назначения, которыми управляет ОС. Объекты следуют строгому интерфейсу и позволяют запрашивать объекты для определения информации. Это что такое COM-объекты?
COM - это механизм, который позволяет повторно использовать объекты (или, скорее, компоненты), независимо от языков, используемых программистом, который реализовал компонент, и программистом, который его использует, и независимо от того, был ли компонент реализован в клиентской программе или в другом месте на машине (или в сети).
Вообще говоря, каждый COM-компонент обеспечивает реализацию одного или нескольких интерфейсов. Эти интерфейсы определены независимым от языка образом с использованием языка определения интерфейсов (IDL) . Например, один из основных интерфейсов COM, IUnknown , определяется следующим образом:
interface IUnknown
{
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef(void) = 0;
virtual ULONG Release(void) = 0;
};
Этот небольшой интерфейс является фундаментальным в COM, потому что каждый компонент COM должен его реализовать. Он определяет два важных аспекта механизма COM:
QueryInterface
позволяет вызывающему коду получить реализацию известного интерфейса. В COM на интерфейсы ссылаются идентификаторы GUID (также известные как идентификаторы интерфейса, IID). Если объект реализует несколько интерфейсов, именно так клиентский код получает ссылку на каждый из этих интерфейсов. Если хотите, он действует как своего рода оператор приведения.AddRef()
и Release()
реализовать механизм управления памятью для COM-объектов. Как следует из их названия, наиболее распространенной моделью является механизм подсчета ссылок, когда экземпляр уничтожается после того, как последний клиент выпустил на него ссылку.Все компоненты COM регистрируются в системе при установке. Если программист хочет использовать определенный компонент, ему необходимо:
CoCreateInstance()
). Вы можете заглянуть в реестр в разделе HKEY_CLASSES_ROOT\CLSID
: каждый GUID там (наиболее вероятно) идентификатор для COM-компонента или интерфейса, а записи под этим ключом сообщают системе, как он должен быть создан.Механизм COM чрезвычайно сложен. Например, реализация или использование компонентов COM в C требует огромного объема работы, но языки более высокого уровня, такие как Visual Basic, сделали многое для упрощения реализации и использования компонентов COM. Однако выгоды вполне реальны. Это позволяет писать приложение, скажем, на Visual Basic, но при этом реализовывать критичные к производительности алгоритмы на C или C ++ в виде COM-объектов, которые можно использовать непосредственно из кода VB. Система заботится о маршалинге аргументов вызова методов, передавая их по потокам, процессам и сетевым соединениям по мере необходимости, чтобы клиентский код создавал впечатление использования обычного объекта.
Многие фундаментальные части Windows основаны на COM. Например, проводник Windows (файловый менеджер) представляет собой пустую оболочку. Он определяет набор COM-интерфейсов для навигации и отображения древовидной иерархии, и весь код, который фактически отображает «Мой компьютер», диски, папки и файлы, представляет собой набор COM-компонентов, реализующих эти интерфейсы.
С появлением .NET COM постепенно устаревает.
COM - это механизм, который был разработан, чтобы позволить людям распространять двоичные файлы, которые можно было бы повторно использовать, даже если вызывающий использовал компилятор C ++ другого поставщика или (в конечном итоге) другой язык вообще.
Если вы хотите получить хорошее представление о COM, прочтите Essential COM от Дона Бокса .
источник