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
远程上下文。 用于创建和管理此类对象的 LocalServer32LocalService 代码在不同的计算机上运行。
CLSCTX_INPROC_HANDLER16
值: 0x20
已过时。
CLSCTX_RESERVED1
值: 0x40
保留。
CLSCTX_RESERVED2
值: 0x80
保留。
CLSCTX_RESERVED3
值: 0x100
保留。
CLSCTX_RESERVED4
值: 0x200
保留。
CLSCTX_NO_CODE_DOWNLOAD
值: 0x400
禁止从目录服务或 Internet 下载代码。 此标志不能与CLSCTX_ENABLE_CODE_DOWNLOAD同时设置。
CLSCTX_RESERVED5
值: 0x800
保留。
CLSCTX_NO_CUSTOM_MARSHAL
值: 0x1000
如果激活使用自定义封送,则指定是否希望激活失败。
CLSCTX_ENABLE_CODE_DOWNLOAD
值: 0x2000
允许从目录服务或 Internet 下载代码。 此标志不能与CLSCTX_NO_CODE_DOWNLOAD同时设置。
CLSCTX_NO_FAILURE_LOG
值: 0x4000
CLSCTX_NO_FAILURE_LOG可用于替代 CoCreateInstanceEx 中失败的日志记录。

如果创建了 ActivationFailureLoggingLevel,则以下值可以确定事件日志记录的状态:


  • 0 = 自由日志记录。 默认情况下为日志,但客户端可以通过在 CoCreateInstanceEx 中指定CLSCTX_NO_FAILURE_LOG来替代。

  • 1 = 无论客户端指定什么,始终记录所有故障。

  • 2 = 无论指定了哪个客户端,都从不记录任何故障。 如果缺少注册表项,则默认值为 0。 如果需要控制客户应用程序,建议将此值设置为 0,并编写客户端代码来替代失败。 强烈建议不要将值设置为 2。 如果禁用了事件日志记录,则更难诊断问题。

CLSCTX_DISABLE_AAA
值: 0x8000
仅对此激活禁用“作为激活者激活”(AAA)。 此标志替代 EOLE_AUTHENTICATION_CAPABILITIES 枚举中EOAC_DISABLE_AAA标志的设置。 此标志不能与CLSCTX_ENABLE_AAA同时设置。 将在调用方标识下启动服务器进程的任何激活称为激活即激活器 (AAA) 激活。 禁用 AAA 激活允许在特权帐户 ((例如 LocalSystem) )下运行的应用程序,以帮助防止其标识用于启动不受信任的组件。 在这些调用期间,使用激活调用的库应用程序应始终设置此标志。 这有助于防止在特权提升安全攻击中使用库应用程序。 这是在库应用程序中禁用 AAA 激活的唯一方法,因为EOLE_AUTHENTICATION_CAPABILITIES枚举中的EOAC_DISABLE_AAA标志仅应用于服务器进程,而不适用于库应用程序。

Windows 2000: 不支持此标志。
CLSCTX_ENABLE_AAA
值: 0x10000
仅对此激活启用“作为激活者激活”(AAA)。 此标志替代 EOLE_AUTHENTICATION_CAPABILITIES 枚举中EOAC_DISABLE_AAA标志的设置。 此标志不能与 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 应用商店应用可以使用此标志启动没有强名称的“As Activator”COM 服务器。 此外,还可以使用此标志绑定到由桌面应用程序启动的 COM 服务器正在运行的实例。

客户端必须是中等 IL,必须具有强名称,这意味着它在客户端令牌中具有 SysAppID,不能在会话 0 中,并且它必须在客户端令牌中具有与会话 ID 的用户相同的用户。

如果服务器处于进程外且“作为激活器”,它将使用客户端令牌会话用户的令牌启动服务器。 此令牌不会强命名。

如果服务器进程外且运行方式为“交互式用户”,则此标志无效。

如果服务器在进程外且是任何其他 RunAs 类型,则激活会失败。

此标志对进程内服务器无效。

计算机外激活在使用此标志时失败。
CLSCTX_RESERVED6
值: 0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
值: 0x2000000
CLSCTX_PS_DLL
值: 0x80000000
用于加载代理/存根 DLL。


注意 此标志保留供内部使用,不应在代码中直接使用。

 

备注

CLSCTX 枚举中的值用于激活调用 (CoCreateInstanceCoCreateInstanceExCoGetClassObject 等) 来指示要在其中运行对象的进程内、本地或远程) (首选执行上下文。 它们还用于对 CoRegisterClassObject 的调用,以指示一组执行上下文,在该上下文中,类对象可用于构造 IClassFactory::CreateInstance) (实例的请求。

若要指示多个上下文是可接受的,可以将多个值与布尔 OR 组合在一起。 将按上下文的列出顺序尝试这些上下文。

给定一组 CLSCTX 标志,要使用的执行上下文取决于根据以下算法注册的类代码和其他参数的可用性。

  1. 如果调用指定了以下任一项,则隐式CLSCTX_REMOTE_SERVER并将其添加到标志列表中:
    1. 一个显式 COSERVERINFO 结构,指示与当前计算机不同的计算机。
    2. 未指定显式 COSERVERINFO 结构,但指定的类是使用 RemoteServerNameActivateAtStorage 注册表值注册的。
    第二种情况允许在发布分布式 COM 之前编写的应用程序成为远程激活类的配置,这些类可由 DCOM 和 CLSCTX_REMOTE_SERVER 标志之前提供的客户端应用程序使用。 不存在显式 COSERVERINFO 结构的情况是,值指定为 NULL ,或者它不是函数参数之一, (如调用 CoCreateInstanceCoGetClassObject) 。
  2. 如果显式 COSERVERINFO 参数指示当前计算机,则删除CLSCTX_REMOTE_SERVER(如果存在)。
其余的处理过程将按以下顺序查看 () 的值:
  1. 如果标志包括 CLSCTX_REMOTE_SERVER并且未指定 COSERVERINFO 参数,并且激活请求指示从中初始化对象的持久性状态, (则使用 CoGetInstanceFromFileCoGetInstanceFromIStorage 或文件名字,在调用 IMoniker::BindToObject) 并且类具有 ActivateAtStorage 无论子项还是没有类注册表信息,激活和初始化请求将转发到永久状态所在的计算机。 (有关详细信息,请参阅另请参阅部分中列出的远程激活函数。)
  2. 如果标志包含 CLSCTX_INPROC_SERVER,则使用此键在类的 InprocServer32 键下找到的 DLL 中的类代码。 类代码将在调用方所在的同一进程中运行。
  3. 如果标志包含CLSCTX_INPROC_HANDLER,则使用此键在类的 InprocHandler32 键下找到的 DLL 中的类代码。 类代码将在调用方所在的同一进程中运行。
  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 位计算机上,同一 COM 服务器的 32 位和 64 位版本可能共存。 当客户端请求激活进程外服务器时,这些 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 Service Pack 1 (SP1) 或更高版本的系统,则 COM 将尝试将服务器体系结构与客户端体系结构匹配。 换句话说,对于 32 位客户端,COM 将激活 32 位服务器(如果可用);否则,它将激活服务器的 64 位版本。 对于 64 位客户端,COM 将激活 64 位服务器(如果可用);否则,它将激活 32 位服务器。
  • 如果承载服务器的计算机运行的是 Windows XP 或 Windows Server 2003,但未安装 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 之前没有注册表值 (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 之前没有注册表值 (,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 服务器