Compartilhar via


Enumeração CLSCTX (wtypesbase.h)

Valores usados em chamadas de ativação para indicar os contextos de execução nos quais um objeto deve ser executado. Esses valores também são usados em chamadas para CoRegisterClassObject para indicar o conjunto de contextos de execução em que um objeto de classe deve ser disponibilizado para solicitações para construir instâncias.

Sintaxe

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;

Constantes

 
CLSCTX_INPROC_SERVER
Valor: 0x1
O código que cria e gerencia objetos dessa classe é uma DLL que é executada no mesmo processo que o chamador da função que especifica o contexto de classe.
CLSCTX_INPROC_HANDLER
Valor: 0x2
O código que gerencia objetos dessa classe é um manipulador em processo. Essa é uma DLL que é executada no processo do cliente e implementa estruturas do lado do cliente dessa classe quando instâncias da classe são acessadas remotamente.
CLSCTX_LOCAL_SERVER
Valor: 0x4
O código EXE que cria e gerencia objetos dessa classe é executado no mesmo computador, mas é carregado em um espaço de processo separado.
CLSCTX_INPROC_SERVER16
Valor: 0x8
Obsoleto.
CLSCTX_REMOTE_SERVER
Valor: 0x10
Um contexto remoto. O localServer32 ou código localService que cria e gerencia objetos dessa classe é executado em um computador diferente.
CLSCTX_INPROC_HANDLER16
Valor: 0x20
Obsoleto.
CLSCTX_RESERVED1
Valor: 0x40
Reservado.
CLSCTX_RESERVED2
Valor: 0x80
Reservado.
CLSCTX_RESERVED3
Valor: 0x100
Reservado.
CLSCTX_RESERVED4
Valor: 0x200
Reservado.
CLSCTX_NO_CODE_DOWNLOAD
Valor: 0x400
Desabilita o download do código do serviço de diretório ou da Internet. Esse sinalizador não pode ser definido ao mesmo tempo que CLSCTX_ENABLE_CODE_DOWNLOAD.
CLSCTX_RESERVED5
Valor: 0x800
Reservado.
CLSCTX_NO_CUSTOM_MARSHAL
Valor: 0x1000
Especifique se deseja que a ativação falhe se ela usar o marshalling personalizado.
CLSCTX_ENABLE_CODE_DOWNLOAD
Valor: 0x2000
Habilita o download do código do serviço de diretório ou da Internet. Esse sinalizador não pode ser definido ao mesmo tempo que CLSCTX_NO_CODE_DOWNLOAD.
CLSCTX_NO_FAILURE_LOG
Valor: 0x4000
O CLSCTX_NO_FAILURE_LOG pode ser usado para substituir o registro em log de falhas noCoCreateInstanceEx .

Se o ActivationFailureLoggingLevel for criado, os seguintes valores poderão determinar o status do registro em log de eventos:


  • 0 = Registro em log discricionário. Faça logon por padrão, mas os clientes podem substituir especificando CLSCTX_NO_FAILURE_LOG em CoCreateInstanceEx.

  • 1 = Sempre registre todas as falhas, independentemente do que o cliente especificou.

  • 2 = Nunca registre falhas, independentemente do cliente especificado. Se a entrada do Registro estiver ausente, o padrão será 0. Se você precisar controlar os aplicativos do cliente, é recomendável definir esse valor como 0 e gravar o código do cliente para substituir falhas. É altamente recomendável que você não defina o valor como 2. Se o registro em log de eventos estiver desabilitado, será mais difícil diagnosticar problemas.

CLSCTX_DISABLE_AAA
Valor: 0x8000
Desabilita ativações como ativadoras (AAA) somente para essa ativação. Esse sinalizador substitui a configuração do sinalizador EOAC_DISABLE_AAA da enumeração EOLE_AUTHENTICATION_CAPABILITIES. Esse sinalizador não pode ser definido ao mesmo tempo que CLSCTX_ENABLE_AAA. Qualquer ativação em que um processo de servidor seria iniciado sob a identidade do chamador é conhecida como ativação como ativadora (AAA). Desabilitar ativações AAA permite que um aplicativo executado em uma conta com privilégios (como o LocalSystem) ajude a impedir que sua identidade seja usada para iniciar componentes não confiáveis. Os aplicativos de biblioteca que usam chamadas de ativação devem sempre definir esse sinalizador durante essas chamadas. Isso ajuda a impedir que o aplicativo de biblioteca seja usado em um ataque de segurança de escalonamento de privilégios. Essa é a única maneira de desabilitar ativações AAA em um aplicativo de biblioteca porque o sinalizador de EOAC_DISABLE_AAA da enumeração EOLE_AUTHENTICATION_CAPABILITIES é aplicado somente ao processo do servidor e não ao aplicativo de biblioteca.

Windows 2000: Não há suporte para esse sinalizador.
CLSCTX_ENABLE_AAA
Valor: 0x10000
Habilita ativações como ativadoras (AAA) somente para essa ativação. Esse sinalizador substitui a configuração do sinalizador EOAC_DISABLE_AAA da enumeração EOLE_AUTHENTICATION_CAPABILITIES. Esse sinalizador não pode ser definido ao mesmo tempo que CLSCTX_DISABLE_AAA. Qualquer ativação em que um processo de servidor seria iniciado sob a identidade do chamador é conhecida como ativação como ativadora (AAA). Habilitar esse sinalizador permite que um aplicativo transfira sua identidade para um componente ativado.

Windows 2000: Não há suporte para esse sinalizador.
CLSCTX_FROM_DEFAULT_CONTEXT
Valor: 0x20000
Inicie essa ativação do contexto padrão do apartamento atual.
CLSCTX_ACTIVATE_X86_SERVER
Valor: 0x40000
CLSCTX_ACTIVATE_32_BIT_SERVER
Ativar ou conectar-se a uma versão de 32 bits do servidor; falhará se um não estiver registrado.
CLSCTX_ACTIVATE_64_BIT_SERVER
Valor: 0x80000
Ativar ou conectar-se a uma versão de 64 bits do servidor; falhará se um não estiver registrado.
CLSCTX_ENABLE_CLOAKING
Valor: 0x100000
Quando esse sinalizador é especificado, COM usa o token de representação do thread, se houver, para a solicitação de ativação feita pelo thread. Quando esse sinalizador não é especificado ou se o thread não tem um token de representação, COM usa o token de processo do processo do thread para a solicitação de ativação feita pelo thread.


Windows Vista ou posterior: Esse sinalizador tem suporte.
CLSCTX_APPCONTAINER
Valor: 0x400000
Indica que a ativação é para um contêiner de aplicativo.


Observação Esse sinalizador é reservado para uso interno e não se destina a ser usado diretamente do código.

 
CLSCTX_ACTIVATE_AAA_AS_IU
Valor: 0x800000
Especifique esse sinalizador para o comportamento de ativação interativa do usuário para servidores As-Activator. Um aplicativo de Il Windows Store médio fortemente nomeado pode usar esse sinalizador para iniciar um servidor COM "Como Ativador" sem um nome forte. Além disso, você pode usar esse sinalizador para associar a uma instância em execução do servidor COM que é iniciada por um aplicativo da área de trabalho.

O cliente deve ser Médio IL, deve ser fortemente nomeado, o que significa que ele tem um SysAppID no token de cliente, não pode estar na sessão 0 e deve ter o mesmo usuário que o usuário da ID da sessão no token de cliente.

Se o servidor estiver fora de processo e "Como Ativador", ele iniciará o servidor com o token do usuário de sessão do token do cliente. Esse token não será fortemente nomeado.

Se o servidor estiver fora de processo e Executar como "Usuário Interativo", esse sinalizador não terá efeito.

Se o servidor estiver fora de processo e for qualquer outro tipo RunAs, a ativação falhará.

Esse sinalizador não tem efeito para servidores em processo.

As ativações fora do computador falham quando usam esse sinalizador.
CLSCTX_RESERVED6
Valor: 0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
Valor: 0x2000000
CLSCTX_PS_DLL
Valor: 0x80000000
Usado para carregar DLLs de Proxy/Stub.

Observação Esse sinalizador é reservado para uso interno e não se destina a ser usado diretamente do código.

Observações

Os valores da enumeração CLSCTX são usados em chamadas de ativação (CoCreateInstance, CoCreateInstanceEx, CoGetClassObject e assim por diante) para indicar os contextos de execução preferenciais (em processo, local ou remoto) em que um objeto deve ser executado. Eles também são usados em chamadas para coRegisterClassObject para indicar o conjunto de contextos de execução em que um objeto de classe deve ser disponibilizado para solicitações para construir instâncias (IClassFactory::CreateInstance).

Para indicar que mais de um contexto é aceitável, você pode combinar vários valores com ORs boolianos. Os contextos são testados na ordem em que estão listados.

Dado um conjunto de sinalizadores CLSCTX, o contexto de execução a ser usado depende da disponibilidade de códigos de classe registrados e outros parâmetros de acordo com o algoritmo a seguir.

  1. Se a chamada especificar um dos seguintes, CLSCTX_REMOTE_SERVER estará implícito e será adicionado à lista de sinalizadores:
    1. Uma estrutura COSERVERINFO explícita indicando um computador diferente do computador atual.
    2. Nenhuma estrutura de COSERVERINFO explícita especificada, mas a classe especificada é registrada com o RemoteServerName ou ActivateAtStorage valor do registro.
    O segundo caso permite que os aplicativos gravados antes do lançamento do COM distribuído sejam a configuração de classes para ativação remota a serem usadas por aplicativos cliente disponíveis antes do DCOM e do sinalizador de CLSCTX_REMOTE_SERVER. Os casos em que não haveria nenhuma estrutura de COSERVERINFO explícita são quando o valor é especificado como NULL ou quando ele não é um dos parâmetros de função (como em chamadas para CoCreateInstance e CoGetClassObject).
  2. Se o parâmetro COSERVERINFO explícito indicar o computador atual, CLSCTX_REMOTE_SERVER será removido se estiver presente.
O restante do processamento continua examinando os valores na seguinte sequência:
  1. Se os sinalizadores incluirem CLSCTX_REMOTE_SERVER e nenhum parâmetro COSERVERINFO for especificado e se a solicitação de ativação indicar um estado persistente do qual inicializar o objeto (com CoGetInstanceFromFile, CoGetInstanceFromIStorage, ou, para um moniker de arquivo, em uma chamada para IMoniker::BindToObject) e a classe tem um ActivateAtStorage subchave ou nenhuma informação de registro de classe, a solicitação para ativar e inicializar é encaminhada para o computador onde reside o estado persistente. (Consulte as funções de ativação remota listadas na seção Consulte Também para obter detalhes.)
  2. Se os sinalizadores incluirem CLSCTX_INPROC_SERVER, o código de classe na DLL encontrado na chave InprocServer32 da classe será usado se essa chave existir. O código de classe será executado no mesmo processo que o chamador.
  3. Se os sinalizadores incluirem CLSCTX_INPROC_HANDLER, o código de classe na DLL encontrado na chave InprocHandler32 da classe será usado se essa chave existir. O código de classe será executado no mesmo processo que o chamador.
  4. Se os sinalizadores incluirem CLSCTX_LOCAL_SERVER, o código de classe no serviço encontrado na chave LocalService da classe será usado se essa chave existir. Se nenhum serviço for especificado, mas um EXE for especificado sob essa mesma chave, o código de classe associado a esse EXE será usado. O código de classe (em ambos os casos) será executado em um processo de serviço separado no mesmo computador que o chamador.
  5. Se o sinalizador estiver definido como CLSCTX_REMOTE_SERVER e um parâmetro de COSERVERINFO adicional para a função especificar um computador remoto específico, uma solicitação para ativar será encaminhada para este computador remoto com sinalizadores modificados para serem definidos como CLSCTX_LOCAL_SERVER. O código de classe será executado em seu próprio processo neste computador específico, que deve ser diferente do chamador.
  6. Por fim, se os sinalizadores incluirem CLSCTX_REMOTE_SERVER e nenhum parâmetro COSERVERINFO for especificado e se um nome de computador for fornecido no RemoteServerName da classe valor nomeado, a solicitação de ativação será encaminhada para este computador remoto com os sinalizadores modificados para serem definidos como CLSCTX_LOCAL_SERVER. O código de classe será executado em seu próprio processo neste computador específico, que deve ser diferente do chamador.

CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER

As versões de 64 bits do Windows apresentam dois novos sinalizadores: CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER. Em um computador de 64 bits, uma versão de 32 bits e 64 bits do mesmo servidor COM pode coexistir. Quando um cliente solicita uma ativação de um servidor fora de processo, esses sinalizadores CLSCTX permitem que o cliente especifique uma versão de 32 bits ou 64 bits do servidor.

Normalmente, um cliente não se importará se ele usa uma versão de 32 bits ou 64 bits do servidor. No entanto, se o próprio servidor carregar um servidor em processo adicional, ele e o servidor em processo deverão ser de 32 ou 64 bits. Por exemplo, suponha que o cliente queira usar um servidor "A", que, por sua vez, carrega um servidor em processo "B". Se apenas uma versão de 32 bits do servidor "B" estiver disponível, o cliente deverá especificar a versão de 32 bits do servidor "A". Se apenas uma versão de 64 bits do servidor "B" estiver disponível, o cliente deverá especificar a versão de 64 bits do servidor "A".

Um servidor pode especificar sua própria preferência de arquitetura por meio do PreferredServerBitness chave do Registro, mas a preferência do cliente, especificada por meio de um sinalizador CLSCTX_ACTIVATE_32_BIT_SERVER ou CLSCTX_ACTIVATE_64_BIT_SERVER, substituirá a preferência do servidor. Se o cliente não especificar uma preferência, a preferência do servidor será usada.

Se o cliente nem o servidor especificar uma preferência, então:

  • Se o computador que hospeda o servidor estiver executando o Windows Server 2003 com o Service Pack 1 (SP1) ou um sistema posterior, o COM tentará corresponder a arquitetura do servidor com a arquitetura do cliente. Em outras palavras, para um cliente de 32 bits, o COM ativará um servidor de 32 bits, se disponível; caso contrário, ele ativará uma versão de 64 bits do servidor. Para um cliente de 64 bits, o COM ativará um servidor de 64 bits, se disponível; caso contrário, ele ativará um servidor de 32 bits.
  • Se o computador que hospeda o servidor estiver executando o Windows XP ou o Windows Server 2003 sem SP1 ou posterior instalado, o COM preferirá uma versão de 64 bits do servidor, se disponível; caso contrário, ele ativará uma versão de 32 bits do servidor.
Se uma enumeração CLSCTX tiver os sinalizadores CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER definidos, ela será inválida e a ativação retornará E_INVALIDARG.

A tabela a seguir mostra os resultados das várias combinações de arquiteturas de cliente e configurações de cliente e arquiteturas de servidor e configurações de servidor.

Os sinalizadores CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER fluem entre os limites do computador. Se o computador que hospeda o servidor estiver executando o Windows de 64 bits, ele honrará esses sinalizadores; caso contrário, ele irá ignorá-los.

Cliente de 32 bits, sem sinalizador Cliente de 64 bits, sem sinalizador Cliente de 32 bits, sinalizador de 32 bits¹ Cliente de 32 bits, flag² de 64 bits Cliente de 64 bits, sinalizador de 32 bits¹ Cliente de 64 bits, flag² de 64 bits
Servidor de 32 bits, corresponder ao valor do registro do cliente. Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸
Servidor de 32 bits, valor do Registro de 32 bits⁴ Servidor de 32 bits Servidor de 32 bits Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸
Servidor de 32 bits, valor do registro de 64 bits⁵ Consulte ⁸ Consulte ⁸ Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸
Servidor de 32 bits, sem valor do Registro⁶ Servidor de 32 bits 32/64⁹ Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸
Servidor de 32 bits, sem valor do Registro (antes do Windows Server 2003 com SP1)⁷ 32/64⁹ 32/64⁹ Servidor de 32 bits Consulte ⁸ Servidor de 32 bits Consulte ⁸
Servidor de 64 bits, corresponder ao valor do registro do cliente. Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits
Servidor de 64 bits, valor do Registro de 32 bits⁴ Consulte ⁸ Consulte ⁸ Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits
Servidor de 64 bits, valor do Registro de 64 bits⁵ Servidor de 64 bits Servidor de 64 bits Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits
Servidor de 64 bits, sem valor do Registro⁶ 32/64¹⁰ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits
Servidor de 64 bits, sem valor do Registro (antes do Windows Server 2003 com SP1)⁷ Servidor de 64 bits Servidor de 64 bits Consulte ⁸ Servidor de 64 bits Consulte ⁸ Servidor de 64 bits

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows 2000 Professional [somente aplicativos da área de trabalho]
servidor com suporte mínimo Windows 2000 Server [somente aplicativos da área de trabalho]
cabeçalho wtypesbase.h

Consulte também

BIND_OPTS2

COSERVERINFO

CoCreateInstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

coGetInstanceFromIStorage

CoRegisterClassObject

criando um objeto por meio de um objeto de classe

IClassActivator::GetClassObject

localizando um objeto remoto

registrando um servidor EXE em execução