Поделиться через


Объекты класса COM и CLSID

COM-сервер реализуется как класс COM. Класс COM — это реализация группы интерфейсов в коде, выполняемой при взаимодействии с заданным объектом. Существует важное различие между классом C++ и классом COM: в C++, класс является типом, а класс COM — это просто определение объекта и не имеет типа, хотя программист C++ может реализовать его с помощью класса C++. COM предназначен для того, чтобы класс использовался различными приложениями, включая приложения, написанные без знания о существовании этого класса. Таким образом, код класса для заданного типа объекта существует либо в динамической связанной библиотеке (DLL), либо в другом исполняемом приложении (EXE).

Каждый класс COM определяется CLSID, уникальным 128-разрядным GUID, который должен зарегистрировать сервер. COM использует этот CLSID по запросу клиента для связывания определенных данных с библиотекой DLL или EXE, содержащей код, реализующий класс, таким образом, создавая экземпляр объекта.

Для клиентов и серверов на одном компьютере CLSID сервера — это все, что требуется клиенту. На каждом компьютере COM поддерживает базу данных (использует системный реестр на платформах Microsoft Windows и Macintosh) всех CLSID для серверов, установленных в системе. Это сопоставление между каждым CLSID и расположением библиотеки DLL или EXE, в которой содержится код для этого CLSID. COM обращается к этой базе данных всякий раз, когда клиент хочет создать экземпляр класса COM и использовать его службы, поэтому клиенту никогда не нужно знать абсолютное расположение кода на компьютере.

Для распределенных систем COM предоставляет записи реестра, позволяющие удаленному серверу регистрироваться для использования клиентом. Хотя приложениям требуется знать только CLSID сервера, так как они могут полагаться на реестр для поиска сервера, COM позволяет клиентам переопределять записи реестра и указывать расположения серверов, чтобы воспользоваться всеми преимуществами сети. (См. раздел Поиск удаленного объекта.)

Основным способом создания экземпляра класса является объект класса COM. Это просто промежуточный объект, который поддерживает функции, общие для создания новых экземпляров данного класса. Большинство объектов класса, используемых для создания объектов из CLSID, поддерживают интерфейс IClassFactory, который включает важный метод CreateInstance. Интерфейс IClassFactory реализуется для каждого класса объекта, который вы предлагаете создать. (Дополнительные сведения о реализации IClassFactory, см. раздел "Реализация IClassFactory".)

Примечание.

Серверы, поддерживающие другой интерфейс фабрики пользовательских классов, не требуются для поддержки IClassFactory в частности. Однако вызовы функций активации, отличных от CoGetClassObject (например, CoCreateInstanceEx), требуют, чтобы сервер поддерживал IClassFactory.

 

Когда клиент хочет создать экземпляр объекта сервера, он использует CLSID требуемого объекта в вызове CoGetClassObject. (Этот вызов может быть прямым или неявным через одну из вспомогательных функций создания объекта.) Эта функция находит код, связанный с CLSID, и создает объект класса и предоставляет указатель на запрошенный интерфейс. (CoGetClassObject принимает параметр riid , указывающий нужный указатель интерфейса клиента.)

Примечание.

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

 

С помощью этого указателя вызывающий объект может создать экземпляр объекта и получить указатель на запрошенный интерфейс объекта. Обычно это интерфейс инициализации, используемый для активации объекта (помещать его в запущенное состояние), чтобы клиент может выполнять все действия с объектом, который он хочет. Используя основные функции COM, клиент также должен заботиться о выпуске всех указателей объектов.

Другим механизмом активации экземпляров объектов является моникер класса. Моникеры классов привязываются к объекту класса класса, для которого они созданы. Дополнительные сведения см. в разделе "Моникеры классов".

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

Создание объекта с помощью объекта класса