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 禁用从目录服务或 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,则以下值可以确定事件日志记录的状态:
|
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 应用商店应用可以使用此标志来启动“作为激活器”COM 服务器,而无需强名称。 此外,可以使用此标志绑定到由桌面应用程序启动的 COM 服务器的正在运行实例。 客户端必须是中等 IL,它必须具有强名称,这意味着它在客户端令牌中具有 SysAppID,它不能位于会话 0 中,并且它必须具有与客户端令牌中的会话 ID 用户相同的用户。 如果服务器进程外且“作为激活器”,则会使用客户端令牌的会话用户的令牌启动服务器。 此令牌不会强命名。 如果服务器进程外且 RunAs 为“交互式用户”,则此标志不起作用。 如果服务器进程外并且是任何其他 RunAs 类型,则激活会失败。 此标志对进程内服务器无效。 使用此标志时,计算机外激活会失败。 |
CLSCTX_RESERVED6 值:0x1000000 |
CLSCTX_ACTIVATE_ARM32_SERVER 值:0x2000000 |
CLSCTX_PS_DLL 值:0x80000000 用于加载代理/存根 DLL。
注意 此标志保留供内部使用,不应直接从代码使用。 |
言论
CLSCTX 枚举中的值用于激活调用(CoCreateInstance、CoCreateInstanceEx、CoGetClassObject等)来指示要在其中运行对象的首选执行上下文(进程内、本地或远程)。 它们还用于调用 CoRegisterClassObject 来指示类对象可用于构造实例的请求(IClassFactory::CreateInstance) 的执行上下文集。
若要指示可以接受多个上下文,可以将多个值与布尔 OR 组合在一起。 上下文按列出顺序进行尝试。
鉴于一组 CLSCTX 标志,要使用的执行上下文取决于注册的类代码和其他参数的可用性,具体取决于以下算法。
- 如果调用指定以下任一项,则隐含CLSCTX_REMOTE_SERVER,并将其添加到标志列表中:
- 显式 COSERVERINFO 结构,指示与当前计算机不同的计算机。
- 未指定显式 COSERVERINFO 结构,但指定的类注册到 RemoteServerName 或 ActivateAtStorage 注册表值。
- 如果显式 COSERVERINFO 参数指示当前计算机,则删除CLSCTX_REMOTE_SERVER(如果存在)。
- 如果标志包括CLSCTX_REMOTE_SERVER且未指定 COSERVERINFO 参数,并且激活请求指示初始化对象的持久状态(使用 CoGetInstanceFromFile、CoGetInstanceFromIStorage或 对于文件名字对象,在对 IMoniker::BindToObject) 的调用中,该类具有 ActivateAtStorage 子项或没有任何类注册表信息, 激活和初始化的请求将转发到持久状态所在的计算机。 (有关详细信息,请参阅“另请参阅”部分中列出的远程激活函数。
- 如果标志包括CLSCTX_INPROC_SERVER,则使用此键时,将使用在类的 InprocServer32 键下找到的 DLL 中的类代码。 类代码将在调用方所在的同一进程中运行。
- 如果标志包括CLSCTX_INPROC_HANDLER,则使用此键时,在类的 InprocHandler32 键下找到的 DLL 中的类代码。 类代码将在调用方所在的同一进程中运行。
- 如果标志包括CLSCTX_LOCAL_SERVER,则使用此键时,将使用在类的 localService LocalService 键下找到的服务中的类代码。 如果未指定任何服务,但在同一个键下指定 EXE,则使用与该 EXE 关联的类代码。 类代码(在任一情况下)将在调用方所在的同一台计算机上的单独服务进程中运行。
- 如果标志设置为CLSCTX_REMOTE_SERVER,并且函数 参数的附加
COSERVERINFO 参数,则会将激活请求转发到此远程计算机,其标志已修改为CLSCTX_LOCAL_SERVER。 类代码将在此特定计算机上在其自己的进程中运行,这必须与调用方的进程不同。 - 最后,如果标志包括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_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 位服务器 |
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | wtypesbase.h |