Какова точная функция CoCreateInstance?

Я программист .NET и новичок в COM. Хотелось бы узнать простыми словами, что такое функция CoCreateInstance?

Ответы

Ответ 1

Вы можете придумать CoCreateInstance() как интерфейс к анонимному классу factory.

В ООП часто бывает разумно использовать шаблон factory, чтобы просто вызвать метод создания и получить указатель/ссылку на интерфейс, не зная, какой именно класс находится за этим интерфейсом. Но вам все равно нужно знать, какой класс использовать как factory. Вы можете скрыть это тоже, имея некоторую глобальную функцию, но вам все равно нужно знать ее имя и соглашения о вызовах.

CoCreateInstance идет дальше - он также скрывает класс factory и предоставляет общесистемную глобальную функцию. Все, что вы предоставляете, это идентификатор класса - это всего лишь GUID - и идентификатор интерфейса, который также является идентификатором GUID. Вы не знаете, где реализована реализация и на каком языке она находится - COM имеет дело со всем, что при наличии в вашей системе COM-сервера, который содержит реализацию для указанного идентификатора класса, который предоставляет интерфейс для указанного идентификатора интерфейса.

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

Ответ 2

Проще говоря, он использовал для создания экземпляра класса, класс указывался с помощью GUID.

HRESULT CoCreateInstance(
  __in   REFCLSID rclsid,   // which class you want
  __in   LPUNKNOWN pUnkOuter, // used in aggregation
  __in   DWORD dwClsContext, // how/where you want the object created
  __in   REFIID riid, // which of the object interfaces you want to use
  __out  LPVOID *ppv // where the pointer to the created object is placed
);

Для получения дополнительной информации прочитайте документация.