Подтвердить что ты не робот

Что такое COM (Component Object Model) в двух словах?

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

4b9b3361

Ответ 1

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-компоненты регистрируются системой при установке. Если программист хочет использовать определенный компонент, ему необходимо:

  • Убедитесь, что компонент установлен в доступном месте. Большую часть времени он находится в системе запущенного приложения, но COM + также позволяет компонентам существовать на удаленных компьютерах.
  • Знайте GUID данного компонента. С помощью этого GUID клиент может попросить систему создать экземпляр компонента (в C функция для этого называется CoCreateInstance()). Вы можете посмотреть в реестре под HKEY_CLASSES_ROOT\CLSID: каждый идентификатор GUID содержит (скорее всего) идентификатор для COM-компонента или интерфейса, а записи ниже этого ключа сообщают системе, как это должно происходить.

СОМ-машина чрезвычайно сложна. Например, реализация или использование COM-компонентов в C требует ужасающего объема работы, но языки более высокого уровня, такие как Visual Basic, сделали много для облегчения внедрения и использования COM-компонентов. Преимущества, однако, очень реальны. Это позволяет писать приложение, скажем, Visual Basic, но по-прежнему выполнять критически важные для работы алгоритмы на C или С++ в виде COM-объектов, которые могут использоваться непосредственно из кода VB. Система позаботится о аргументах метода-вызова сортировки, передавая их по потокам, процессам и сетевым соединениям по мере необходимости, чтобы клиентский код имел представление об использовании обычного объекта.

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

С появлением .NET COM постепенно устаревает.

Ответ 2

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

Если вы хотите хорошее введение в COM, прочитайте Essential COM Дон Box.

Ответ 3

Подумайте об этом так: когда .NET вышел, я сразу подумал: "Ого... это COM, но он не сосать".