COM является механизмом, который был разработан, чтобы позволить людям распределять двоичные файлы, которые могли быть снова использованы, даже если бы вызывающая сторона использовала компилятор C++ другого поставщика или (в конечном счете) различный язык в целом.
, Если Вы хотите хорошее введение в 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-компонента или интерфейса, и записи ниже того ключа говорят систему, как это должен быть instanciated. оборудование COM чрезвычайно сложно. Например, реализация или использование COM-компонентов в C требуют ужасающего объема работы, но высокоуровневые языки как Visual Basic сделали много для упрощения реализации и использования COM-компонентов. Преимущества однако очень реальны. Это позволяет записать приложение в, скажем, Visual Basic, но все еще реализовать критические по отношению к производительности алгоритмы в C или C++ как COM-объекты, которые могут использоваться непосредственно от кода VB. Система заботится о [1 121] маршалинг аргументы вызова метода, передавая их через потоки, процессы и сетевые соединения по мере необходимости так, чтобы клиентский код имел впечатление от использования обычного объекта.
Много фундаментальных частей Windows основаны на COM. Windows Explorer (файловый менеджер), например, является в основном пустой оболочкой. Это определяет набор COM-интерфейсов для навигации и отображения древовидных иерархий и всего кода, который на самом деле отображает "Мой Компьютер", диски, папки и файлы как ряд COM-компонентов, которые реализуют те интерфейсы.
С появлением.NET, COM медленно становится устаревшим.