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



Использование SCM - часть 2


Эти флаги могут быть подвергнуты побитному логическому сложению (bit-wise-ORed together), и в случае, когда доступен более чем один запрошенный CLSCTX, СОМ выберет наиболее эффективный тип сервера (это означает, что СОМ будет, когда это возможно, использовать наименее значимый бит битовой маски). Заголовочные файлы SDK также включают в себя несколько сокращенных макросов, которые сочетают несколько флагов CLSCTX, используемых во многих обычных сценариях:

#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER | \ CLSCTX_INPROC_HANDLER) #define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | \ CLSCTX_LOCAL_SERVER | \ CLSCTX_REMOTE_SERVER) #define CLSCTX_ALL (CLSCTX_INPROC_SERVER | \ CLSCTX_INPROC_HANDLER | \ CLSCTX_LOCAL_SERVER | \ CLSCTX_REMOTE_SERVER)

Заметим, что такие среды, как Visual Basic и Java, всегда используют CLSCTX_ALL, показывая тем самым, что подойдет любая доступная реализация.

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

typedef struct _COSERVERINFO { DWORD dwReserved1; // reserved, must be zero // зарезервировано, должен быть нуль LPWSTR pwszName; // desired host name, or null // желаемое имя хост-машины или нуль COAUTHINFO *pAuthInfo; // desired security settings // желаемые установки безопасности DWORD dwReserved2; // reserved, must be zero // зарезервировано, должен быть нуль } COSERVERINFO;

Если клиент не указывает имя хоста (host name), а использует только флаг CLSCTX_REMOTE_SERVER, то для определения того, какая машина будет активировать объект, СОМ использует информацию о конфигурации каждого CLSID. Если клиент передает явное имя хоста, то оно получит приоритет перед любыми ранее сконфигурированными именами хостов, о которых может знать СОМ. Если клиент не желает передавать явную информацию о безопасности или имя хоста в CoGetClassObject, можно применить нулевой указатель COSERVERINFO.




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