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


Перечисление 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. Строго именованное приложение Среднего IL Магазина Windows может использовать этот флаг для запуска COM-сервера As Activator без строгого имени. Кроме того, этот флаг можно использовать для привязки к работающему экземпляру COM-сервера, запущенного классическим приложением.

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

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

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

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

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

Активация вне компьютера завершается сбоем при использовании этого флага.
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-разрядный сервер

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
заголовка wtypesbase.h

См. также

BIND_OPTS2

COSERVERINFO

CoCreateInstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

CoGetInstanceFromIStorage

CoRegisterClassObject

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

IClassActivator::GetClassObject

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

регистрация запущенного сервера EXE Server