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


Перечисление CLSCTX (wtypesbase.h)

Значения, используемые в вызовах активации для указания контекстов выполнения, в которых должен выполняться объект. Эти значения также используются в вызовах CoRegisterClassObject для указания набора контекстов выполнения, в которых объект класса должен быть доступен для запросов на создание экземпляров.

Синтаксис

typedef enum tagCLSCTX {
  CLSCTX_INPROC_SERVER = 0x1,
  CLSCTX_INPROC_HANDLER = 0x2,
  CLSCTX_LOCAL_SERVER = 0x4,
  CLSCTX_INPROC_SERVER16 = 0x8,
  CLSCTX_REMOTE_SERVER = 0x10,
  CLSCTX_INPROC_HANDLER16 = 0x20,
  CLSCTX_RESERVED1 = 0x40,
  CLSCTX_RESERVED2 = 0x80,
  CLSCTX_RESERVED3 = 0x100,
  CLSCTX_RESERVED4 = 0x200,
  CLSCTX_NO_CODE_DOWNLOAD = 0x400,
  CLSCTX_RESERVED5 = 0x800,
  CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
  CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
  CLSCTX_NO_FAILURE_LOG = 0x4000,
  CLSCTX_DISABLE_AAA = 0x8000,
  CLSCTX_ENABLE_AAA = 0x10000,
  CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
  CLSCTX_ACTIVATE_X86_SERVER = 0x40000,
  CLSCTX_ACTIVATE_32_BIT_SERVER,
  CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,
  CLSCTX_ENABLE_CLOAKING = 0x100000,
  CLSCTX_APPCONTAINER = 0x400000,
  CLSCTX_ACTIVATE_AAA_AS_IU = 0x800000,
  CLSCTX_RESERVED6 = 0x1000000,
  CLSCTX_ACTIVATE_ARM32_SERVER = 0x2000000,
  CLSCTX_ALLOW_LOWER_TRUST_REGISTRATION,
  CLSCTX_PS_DLL = 0x80000000
} CLSCTX;

Константы

 
CLSCTX_INPROC_SERVER
Значение: 0x1
Код, создающий объекты этого класса и управляющий ими, представляет собой DLL, выполняемую в том же процессе, что и вызывающий объект функции, задающий контекст класса.
CLSCTX_INPROC_HANDLER
Значение: 0x2
Код, управляющий объектами этого класса, является внутрипроцессным обработчиком. Это библиотека DLL, которая выполняется в клиентском процессе и реализует клиентские структуры этого класса при удаленном доступе к экземплярам класса.
CLSCTX_LOCAL_SERVER
Значение: 0x4
EXE-код, создающий объекты этого класса и управляющий ими, выполняется на том же компьютере, но загружается в отдельное пространство процесса.
CLSCTX_INPROC_SERVER16
Значение: 0x8
Является устаревшей.
CLSCTX_REMOTE_SERVER
Значение: 0x10
Удаленный контекст. Код LocalServer32 или LocalService , который создает объекты этого класса и управляет ими, выполняется на другом компьютере.
CLSCTX_INPROC_HANDLER16
Значение: 0x20
Является устаревшей.
CLSCTX_RESERVED1
Значение: 0x40
Зарезервировано.
CLSCTX_RESERVED2
Значение: 0x80
Зарезервировано.
CLSCTX_RESERVED3
Значение: 0x100
Зарезервировано.
CLSCTX_RESERVED4
Значение: 0x200
Зарезервировано.
CLSCTX_NO_CODE_DOWNLOAD
Значение: 0x400
Отключает скачивание кода из службы каталогов или Из Интернета. Этот флаг нельзя задать одновременно с CLSCTX_ENABLE_CODE_DOWNLOAD.
CLSCTX_RESERVED5
Значение: 0x800
Зарезервировано.
CLSCTX_NO_CUSTOM_MARSHAL
Значение: 0x1000
Укажите, если вы хотите, чтобы активация завершилась сбоем, если в ней используется настраиваемое маршалирование.
CLSCTX_ENABLE_CODE_DOWNLOAD
Значение: 0x2000
Позволяет скачивать код из службы каталогов или Из Интернета. Этот флаг нельзя задать одновременно с CLSCTX_NO_CODE_DOWNLOAD.
CLSCTX_NO_FAILURE_LOG
Значение: 0x4000
CLSCTX_NO_FAILURE_LOG можно использовать для переопределения ведения журнала сбоев в CoCreateInstanceEx.

При создании ActivationFailureLoggingLevel состояние ведения журнала событий могут определять следующие значения:


  • 0 = дискреционное ведение журнала. Журнал по умолчанию, но клиенты могут переопределить, указав CLSCTX_NO_FAILURE_LOG в CoCreateInstanceEx.

  • 1 = всегда регистрируются все сбои независимо от того, что указал клиент.

  • 2 = Никогда не регистрируются сбои независимо от того, какой клиент указан. Если запись реестра отсутствует, по умолчанию используется значение 0. Если необходимо управлять клиентскими приложениями, рекомендуется задать для этого значения значение 0 и написать код клиента, чтобы переопределить сбои. Настоятельно не рекомендуется задавать значение 2. Если ведение журнала событий отключено, диагностировать проблемы сложнее.

CLSCTX_DISABLE_AAA
Значение: 0x8000
Отключает активации AAA (активируется как активатор) только для этой активации. Этот флаг переопределяет параметр флага EOAC_DISABLE_AAA из перечисления EOLE_AUTHENTICATION_CAPABILITIES. Этот флаг нельзя задать одновременно с CLSCTX_ENABLE_AAA. Любая активация, при которой серверный процесс запускается под удостоверением вызывающей стороны, называется активацией как активатора (AAA). Отключение активации AAA позволяет приложению, работающему под привилегированной учетной записью (например, LocalSystem), предотвратить использование удостоверения для запуска ненадежных компонентов. Приложения библиотеки, использующие вызовы активации, всегда должны устанавливать этот флаг во время этих вызовов. Это помогает предотвратить использование приложения библиотеки при атаке безопасности с повышением привилегий. Это единственный способ отключить активацию AAA в приложении библиотеки, так как флаг EOAC_DISABLE_AAA из перечисления EOLE_AUTHENTICATION_CAPABILITIES применяется только к серверному процессу, а не к приложению библиотеки.

Windows 2000: Этот флаг не поддерживается.
CLSCTX_ENABLE_AAA
Значение: 0x10000
Включает активации AAA (активируется как активатор) только для этой активации. Этот флаг переопределяет параметр флага EOAC_DISABLE_AAA из перечисления EOLE_AUTHENTICATION_CAPABILITIES. Этот флаг нельзя задать одновременно с CLSCTX_DISABLE_AAA. Любая активация, при которой серверный процесс запускается под удостоверением вызывающей стороны, называется активацией как активатора (AAA). Включение этого флага позволяет приложению передавать свое удостоверение активированным компонентам.

Windows 2000: Этот флаг не поддерживается.
CLSCTX_FROM_DEFAULT_CONTEXT
Значение: 0x20000
Эту активацию следует начинать с контекста по умолчанию текущего апартмента.
CLSCTX_ACTIVATE_X86_SERVER
Значение: 0x40000
CLSCTX_ACTIVATE_32_BIT_SERVER
Активация или подключение к 32-разрядной версии сервера; сбой, если он не зарегистрирован.
CLSCTX_ACTIVATE_64_BIT_SERVER
Значение: 0x80000
Активация или подключение к 64-разрядной версии сервера; сбой, если он не зарегистрирован.
CLSCTX_ENABLE_CLOAKING
Значение: 0x100000
При указании этого флага COM использует токен олицетворения потока, если он присутствует, для запроса на активацию, сделанного потоком. Если этот флаг не указан или если у потока нет маркера олицетворения, COM использует маркер процесса потока для запроса активации, сделанного потоком.


Windows Vista или более поздней версии: Этот флаг поддерживается.
CLSCTX_APPCONTAINER
Значение: 0x400000
Указывает, что активация выполняется для контейнера приложения.


Примечание Этот флаг зарезервирован для внутреннего использования и не предназначен для использования непосредственно из кода.

 
CLSCTX_ACTIVATE_AAA_AS_IU
Значение: 0x800000
Укажите этот флаг для поведения интерактивной активации пользователей для серверов As-Activator. Приложение Магазина Windows со строгим именем Medium IL может использовать этот флаг для запуска COM-сервера "Как активатор" без строгого имени. Кроме того, этот флаг можно использовать для привязки к работающему экземпляру COM-сервера, запущенного классическим приложением.

Клиент должен иметь значение Medium IL, он должен иметь строгое имя, что означает, что у него есть SysAppID в маркере клиента, он не может находиться в сеансе 0 и должен иметь того же пользователя, что и пользователь идентификатора сеанса в маркере клиента.

Если сервер находится вне процесса и является "Активатором", он запускает сервер с маркером пользователя сеанса клиентского маркера. Этот маркер не будет иметь строгого имени.

Если сервер выходит за пределы процесса и выполняется "Интерактивный пользователь", этот флаг не действует.

Если сервер находится вне процесса и имеет любой другой тип запуска от имени, активация завершается ошибкой.

Этот флаг не действует для внутрипроцессных серверов.

Активация за компьютером завершается сбоем при использовании этого флага.
CLSCTX_RESERVED6
Значение: 0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
Значение: 0x2000000
CLSCTX_PS_DLL
Значение: 0x80000000
Используется для загрузки библиотек DLL прокси-сервера или заглушки.


Примечание Этот флаг зарезервирован для внутреннего использования и не предназначен для использования непосредственно из кода.

 

Комментарии

Значения перечисления CLSCTX используются в вызовах активации (CoCreateInstance, CoCreateInstanceEx, CoGetClassObject и т. д.), чтобы указать предпочтительный контекст выполнения (внутрипроцессный, локальный или удаленный), в котором должен выполняться объект. Они также используются в вызовах CoRegisterClassObject для указания набора контекстов выполнения, в которых объект класса должен быть доступен для запросов на создание экземпляров (IClassFactory::CreateInstance).

Чтобы указать, что допустимо несколько контекстов, можно объединить несколько значений с логическими OR. Контексты используются в порядке их перечисления.

При наличии набора флагов CLSCTX используемый контекст выполнения зависит от доступности зарегистрированных кодов классов и других параметров в соответствии со следующим алгоритмом.

  1. Если вызов задает одно из следующих значений, CLSCTX_REMOTE_SERVER подразумевается и добавляется в список флагов:
    1. Явная структура COSERVERINFO , указывающая, что компьютер отличается от текущего компьютера.
    2. Не указана явная структура COSERVERINFO , но указанный класс регистрируется с помощью значения реестра RemoteServerName или ActivateAtStorage .
    Во втором случае приложения, написанные до выпуска распределенного COM, могут быть конфигурацией классов для удаленной активации, которые будут использоваться клиентскими приложениями, доступными до DCOM и флагом CLSCTX_REMOTE_SERVER. В случаях, когда не будет явной структуры COSERVERINFO , задано значение NULL или если оно не является одним из параметров функции (как в вызовах CoCreateInstance и CoGetClassObject).
  2. Если явный параметр COSERVERINFO указывает на текущий компьютер, CLSCTX_REMOTE_SERVER удаляется при наличии.
Остальная часть обработки продолжается путем просмотра значений в следующей последовательности:
  1. Если флаги включают CLSCTX_REMOTE_SERVER и параметр COSERVERINFO не указан, и если запрос на активацию указывает постоянное состояние, из которого необходимо инициализировать объект (с coGetInstanceFromFile, CoGetInstanceFromIStorage или, для моникера файла, в вызове IMoniker::BindToObject), а класс имеет ActivateAtStorage подраздел или без сведений реестра классов запрос на активацию и инициализацию пересылается на компьютер, на котором находится постоянное состояние. (Дополнительные сведения см. в описании функций удаленной активации, перечисленных в разделе См. также.)
  2. Если флаги включают CLSCTX_INPROC_SERVER, код класса в библиотеке DLL, найденной в ключе InprocServer32 класса, используется, если этот ключ существует. Код класса будет выполняться в том же процессе, что и вызывающий объект.
  3. Если флаги включают CLSCTX_INPROC_HANDLER, код класса в библиотеке DLL, найденной в ключе InprocHandler32 класса, используется, если этот ключ существует. Код класса будет выполняться в том же процессе, что и вызывающий объект.
  4. Если флаги включают CLSCTX_LOCAL_SERVER, используется код класса в службе, найденной в ключе LocalService класса, если этот ключ существует. Если служба не указана, но в том же ключе указан EXE-файл, используется код класса, связанный с этим EXE- файлом. Код класса (в любом случае) будет выполняться в отдельном процессе службы на том же компьютере, что и вызывающий объект.
  5. Если для флага задано значение CLSCTX_REMOTE_SERVER а дополнительный параметр COSERVERINFO для функции указывает конкретный удаленный компьютер, запрос на активацию перенаправит на этот удаленный компьютер с флагами, измененными на CLSCTX_LOCAL_SERVER. Код класса будет выполняться в собственном процессе на этом конкретном компьютере, который должен отличаться от кода вызывающего объекта.
  6. Наконец, если флаги включают CLSCTX_REMOTE_SERVER и параметр COSERVERINFO не указан, а имя компьютера задано в параметре RemoteServerName класса с именем-значением, запрос на активацию перенаправит на этот удаленный компьютер с измененными флагами для CLSCTX_LOCAL_SERVER. Код класса будет выполняться в собственном процессе на этом конкретном компьютере, который должен отличаться от кода вызывающего объекта.

CLSCTX_ACTIVATE_32_BIT_SERVER и CLSCTX_ACTIVATE_64_BIT_SERVER

В 64-разрядных версиях Windows появились два новых флага: CLSCTX_ACTIVATE_32_BIT_SERVER и CLSCTX_ACTIVATE_64_BIT_SERVER. На 64-разрядном компьютере может сосуществовать 32-разрядная и 64-разрядная версии одного и того же COM-сервера. Когда клиент запрашивает активацию внепроцессного сервера, эти флаги CLSCTX позволяют клиенту указать 32-разрядную или 64-разрядную версию сервера.

Как правило, клиенту не важно, используется ли 32-разрядная или 64-разрядная версия сервера. Однако если сам сервер загружает дополнительный внутрипроцессный сервер, он и внутрипроцессный сервер должны быть либо 32-разрядными, либо 64-разрядными. Например, предположим, что клиент хочет использовать сервер "A", который, в свою очередь, загружает внутрипроцессный сервер "B". Если доступна только 32-разрядная версия сервера "B", клиент должен указать 32-разрядную версию сервера "A". Если доступна только 64-разрядная версия сервера "B", клиент должен указать 64-разрядную версию сервера "A".

Сервер может указать собственные параметры архитектуры с помощью раздела реестра PreferredServerBitness, но предпочтения клиента, заданные с помощью флага CLSCTX_ACTIVATE_32_BIT_SERVER или CLSCTX_ACTIVATE_64_BIT_SERVER, переопределяют предпочтения сервера. Если клиент не указывает предпочтения, будет использоваться предпочтение сервера.

Если ни клиент, ни сервер не указывают предпочтения, то:

  • Если компьютер, на котором размещен сервер, работает под управлением Windows Server 2003 с пакетом обновления 1 (SP1) или более поздней системы, com попытается сопоставить архитектуру сервера с архитектурой клиента. Другими словами, для 32-разрядного клиента COM активирует 32-разрядный сервер, если он доступен; в противном случае будет активирована 64-разрядная версия сервера. Для 64-разрядного клиента COM активирует 64-разрядный сервер, если он доступен; в противном случае он активирует 32-разрядный сервер.
  • Если компьютер, на котором размещается сервер, работает под управлением Windows XP или Windows Server 2003 без установленного пакета обновления 1 (SP1) или более поздней версии, com предпочтет 64-разрядную версию сервера, если она доступна. в противном случае будет активирована 32-разрядная версия сервера.
Если для перечисления CLSCTX заданы флаги CLSCTX_ACTIVATE_32_BIT_SERVER и CLSCTX_ACTIVATE_64_BIT_SERVER, то оно будет недопустимым и активация вернет E_INVALIDARG.

В следующей таблице показаны результаты различных сочетаний клиентских архитектур и параметров клиента, а также серверных архитектур и параметров сервера.

Флаги CLSCTX_ACTIVATE_32_BIT_SERVER и CLSCTX_ACTIVATE_64_BIT_SERVER передаются через границы компьютера. Если компьютер, на котором размещен сервер, работает под управлением 64-разрядной версии Windows, он будет учитывать эти флаги; в противном случае они будут игнорироваться.

32-разрядный клиент без флага 64-разрядный клиент без флага 32-разрядный клиент, 32-разрядный флаг 32-разрядный клиент, 64-разрядный флаг 64-разрядный клиент, 32-разрядный флаг 64-разрядный клиент, 64-разрядный флаг
32-разрядный сервер, совпадает со значением реестра клиента 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸
32-разрядный сервер, 32-разрядное значение реестра⁴ 32-разрядный сервер 32-разрядный сервер 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸
32-разрядный сервер, 64-разрядное значение реестра⁵ См. ⁸ См. ⁸ 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸
32-разрядный сервер без значения реестра⁶ 32-разрядный сервер 64/32⁹ 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸
32-разрядный сервер без значения реестра (до Windows Server 2003 с пакетом обновления 1 (SP1)⁷ 64/32⁹ 64/32⁹ 32-разрядный сервер См. ⁸ 32-разрядный сервер См. ⁸
64-разрядный сервер, совпадающий со значением реестра клиента См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер
64-разрядный сервер, 32-разрядное значение реестра⁴ См. ⁸ См. ⁸ См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер
64-разрядный сервер, 64-разрядное значение реестра⁵ 64-разрядный сервер 64-разрядный сервер См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер
64-разрядный сервер, без значения реестра⁶ 32/64¹ 64-разрядный сервер См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер
64-разрядный сервер без значения реестра (до Windows Server 2003 с пакетом обновления 1 (SP1)⁷ 64-разрядный сервер 64-разрядный сервер См. ⁸ 64-разрядный сервер См. ⁸ 64-разрядный сервер
 

PreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitness PreferredServerBitnessPreferredServerBitness

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть wtypesbase.h

См. также раздел

BIND_OPTS2

COSERVERINFO

CoCreateInstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

CoGetInstanceFromiStorage

CoRegisterClassObject

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

IClassActivator::GetClassObject

Поиск удаленного объекта

Регистрация запущенного СЕРВЕРА EXE