В чем разница между CoCreateInstance () и CoGetClassObject () при создании объектов на одном компьютере? - PullRequest
6 голосов
/ 05 мая 2009

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

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

Ответы [ 2 ]

10 голосов
/ 05 мая 2009

CoGetClassObject по существу возвращает вам указатель на фабрику для определенного интерфейса. Под капотом CoCreateInstance используется CoGetClassObject. Преимущество вызова CoGetClassObject заключается в том, что он позволяет создавать фабрику классов только один раз, если вы хотите создать множество экземпляров определенного объекта.

В разделе MSDN CoGetClassObject кратко обсуждается, как вы можете воспользоваться этой функцией.

1 голос
/ 09 декабря 2009

Один сценарий в дополнение к тому, что сказал JaredPar - CoGetClassObject возвращает вам фабрику классов (вызывает экспортированную функцию DLLGetClassObject вашей DLL в случае сервера inproc). Фабрика классов используется для создания экземпляров класса. CoCreateInstance внутренне вызывает CoGetClassObject, получает требуемую фабрику классов и затем использует ее для создания экземпляра запрошенного вами Coclass. Вызывая CoCreateInstance, вы не можете отложить создание кокласса. Временами создание coclass может быть дорогостоящим, и вы можете отложить его создание, но при этом иметь доступ к фабрике классов, чтобы можно было создавать экземпляры coclass по требованию.

...