Здається, об’єкти COM - це об’єкти загального користування, які регулюються ОС. Об'єкти відповідають суворому інтерфейсу і дозволяють запитувати об'єкти для визначення інформації. Це що таке COM-об'єкти?
Здається, об’єкти 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 повільно застаріває.
COM - це механізм, який був розроблений, щоб дозволити людям поширювати двійкові файли, які можна використовувати повторно, навіть якщо абонент використовував компілятор C ++ іншого постачальника або (зрештою) іншу мову взагалі.
Якщо ви хочете отримати гарний вступ до COM, прочитайте Essential COM від Don Box .