Сущность технологии COM




Использование SCM


Напомним, что SCM поддерживает три примитива активации (связывание с объектами класса, связывание с экземплярами класса, связывание с постоянными экземплярами из файлов). Как показано на рис. 3.2, эти примитивы логически разделены на уровни. Примитивом нижнего уровня является связывание с объектом класса. Этот примитив также наиболее прост для понимания.

Вместо того чтобы вручную загружать код класса, клиенты пользуются услугами SCM посредством низкоуровневой API-функции СОМ CoGetClassObject. Эта функция запрашивает SCM присвоить значение указателю на требуемый объект класса:

HRESULT CoGetClassObject( [in] REFCLSID rclsid, // which class object? // Какой объект класса? [in] DWORD dwClsCtx, // locality? //местонахождение? [in] COSERVERINFO *pcsi, // host/security info //сведения о сервере и обеспечении безопасности [in] REFIID riid, // which interface? // какой интерфейс? [out, iid_is(riid)] void **ppv); // put it here! // поместим его здесь!

Рис. 3.2. Примитивы активации

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

В качестве второго параметра CoGetClassObject принимает битовую маску (bitmask), которая позволяет клиенту указать характеристики скрытого и живучего состояний объекта (например, будет ли объект запущен в процессе, вне процесса или вообще на другом сервере). Допустимые значения для этой битовой маски определены в стандартном перечислении CLSCTX:

enum tagCLSCTX { CLSCTX_INPROC_SERVER = 0х1, // run -inprocess // запуск в процесс CLSCTX_INPROC_HANDLER = 0х2, // see note // смотрите сноску CLSCTX_LOCAL_SERVER = 0х4, // run out-of-process // запуск вне процесса CLSCTX_REMOTE_SERVER = 0х10 // run off-host // запуск вне хост-машины } CLSCTX;




Содержание  Назад  Вперед