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