Що таке COM (компонентна об'єктна модель) у двох словах? [зачинено]


89

Здається, об’єкти COM - це об’єкти загального користування, які регулюються ОС. Об'єкти відповідають суворому інтерфейсу і дозволяють запитувати об'єкти для визначення інформації. Це що таке COM-об'єкти?

c++  com 

Відповіді:


111

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 надзвичайно складний. Наприклад, реалізація або використання COM-компонентів в C вимагає жахливого обсягу роботи, але мови вищого рівня, такі як Visual Basic, зробили багато для полегшення впровадження та використання COM-компонентів. Однак переваги цілком реальні. Це дозволяє писати програми, скажімо, в Visual Basic, але все одно реалізовувати критичні для продуктивності алгоритми в C або C ++ як COM-об'єкти, які можна використовувати безпосередньо з коду VB. Система піклується про маршування аргументів виклику методу, передаючи їх через потоки, процеси та мережеві підключення за потреби, щоб у клієнтського коду склалося враження, що він використовує звичайний об'єкт.

Багато основних частин Windows засновані на COM. Наприклад, Провідник Windows (файловий менеджер) - це в основному порожня оболонка. Він визначає купу COM-інтерфейсів для навігації та відображення ієрархій дерев, а весь код, який фактично відображає "Мій комп'ютер", диски, папки та файли, є набором COM-компонентів, що реалізують ці інтерфейси.

З появою .NET COM COM повільно застаріває.


10
Джерело останнього рядка?
Shad

32

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

Якщо ви хочете отримати гарний вступ до COM, прочитайте Essential COM від Don Box .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.