Enumerazione CLSCTX (wtypesbase.h)

Valori usati nelle chiamate di attivazione per indicare i contesti di esecuzione in cui eseguire un oggetto. Questi valori vengono usati anche nelle chiamate a CoRegisterClassObject per indicare il set di contesti di esecuzione in cui un oggetto classe deve essere reso disponibile per le richieste per costruire istanze.

Sintassi

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;

Costanti

 
CLSCTX_INPROC_SERVER
Valore: 0x1
Il codice tramite cui vengono creati e gestiti gli oggetti di questa classe è una DLL che viene eseguita nello stesso processo del chiamante della funzione che specifica il contesto della classe.
CLSCTX_INPROC_HANDLER
Valore: 0x2
Il codice tramite cui vengono gestiti gli oggetti di questa classe è un gestore in-process. Si tratta di una DLL eseguita nel processo client e implementa le strutture lato client di questa classe quando le istanze della classe vengono accessibili in remoto.
CLSCTX_LOCAL_SERVER
Valore: 0x4
Il codice EXE tramite cui vengono creati e gestiti gli oggetti di questa classe viene eseguito nello stesso computer, ma viene caricato in uno spazio processi distinto.
CLSCTX_INPROC_SERVER16
Valore: 0x8
Obsoleta.
CLSCTX_REMOTE_SERVER
Valore: 0x10
Contesto remoto. Il codice LocalServer32 o LocalService che crea e gestisce gli oggetti di questa classe viene eseguito in un computer diverso.
CLSCTX_INPROC_HANDLER16
Valore: 0x20
Obsoleta.
CLSCTX_RESERVED1
Valore: 0x40
Riservato.
CLSCTX_RESERVED2
Valore: 0x80
Riservato.
CLSCTX_RESERVED3
Valore: 0x100
Riservato.
CLSCTX_RESERVED4
Valore: 0x200
Riservato.
CLSCTX_NO_CODE_DOWNLOAD
Valore: 0x400
Disabilita il download del codice dal servizio directory o da Internet. Questo flag non può essere impostato contemporaneamente a CLSCTX_ENABLE_CODE_DOWNLOAD.
CLSCTX_RESERVED5
Valore: 0x800
Riservato.
CLSCTX_NO_CUSTOM_MARSHAL
Valore: 0x1000
Specificare se si vuole che l'attivazione non riesca se usa marshalling personalizzato.
CLSCTX_ENABLE_CODE_DOWNLOAD
Valore: 0x2000
Abilita il download del codice dal servizio directory o da Internet. Questo flag non può essere impostato contemporaneamente a CLSCTX_NO_CODE_DOWNLOAD.
CLSCTX_NO_FAILURE_LOG
Valore: 0x4000
Il CLSCTX_NO_FAILURE_LOG può essere usato per eseguire l'override della registrazione degli errori in CoCreateInstanceEx.

Se viene creato ActivationFailureLoggingLevel, i valori seguenti possono determinare lo stato della registrazione eventi:


  • 0 = Registrazione discrezionale. Per impostazione predefinita, i client possono eseguire l'override specificando CLSCTX_NO_FAILURE_LOG in CoCreateInstanceEx.

  • 1 = Registra sempre tutti gli errori indipendentemente dal client specificato.

  • 2 = Non registrare mai errori indipendentemente dal client specificato. Se la voce del Registro di sistema manca, il valore predefinito è 0. Se è necessario controllare le applicazioni dei clienti, è consigliabile impostare questo valore su 0 e scrivere il codice client per eseguire l'override degli errori. È consigliabile non impostare il valore su 2. Se la registrazione eventi è disabilitata, è più difficile diagnosticare i problemi.

CLSCTX_DISABLE_AAA
Valore: 0x8000
Disabilita le attivazioni AAA (activate-as-activator) solo per questa attivazione. Questo flag esegue l'override dell'impostazione del flag EOAC_DISABLE_AAA dall'enumerazione EOLE_AUTHENTICATION_CAPABILITIES. Questo flag non può essere impostato contemporaneamente all'CLSCTX_ENABLE_AAA. Qualsiasi attivazione in cui verrà avviato un processo server sotto l'identità del chiamante è noto come attivazione come attivazione come attivazione (AAA). La disabilitazione delle attivazioni di AAA consente a un'applicazione eseguita con un account con privilegi (ad esempio LocalSystem) di impedire l'uso dell'identità per avviare componenti non attendibili. Le applicazioni di libreria che usano le chiamate di attivazione devono sempre impostare questo flag durante queste chiamate. Ciò consente di impedire l'uso dell'applicazione di libreria in un attacco di sicurezza con privilegi di escalation. Questo è l'unico modo per disabilitare le attivazioni AAA in un'applicazione di libreria perché il flag EOAC_DISABLE_AAA dall'enumerazione EOLE_AUTHENTICATION_CAPABILITIES viene applicato solo al processo del server e non all'applicazione di libreria.

Windows 2000: Questo flag non è supportato.
CLSCTX_ENABLE_AAA
Valore: 0x10000
Attiva le attivazioni AAA (activate-as-activator) solo per questa attivazione. Questo flag esegue l'override dell'impostazione del flag EOAC_DISABLE_AAA dall'enumerazione EOLE_AUTHENTICATION_CAPABILITIES. Questo flag non può essere impostato contemporaneamente a CLSCTX_DISABLE_AAA. Qualsiasi attivazione in cui verrà avviato un processo server sotto l'identità del chiamante è noto come attivazione come attivazione come attivazione (AAA). L'abilitazione di questo flag consente a un'applicazione di trasferire l'identità a un componente attivato.

Windows 2000: Questo flag non è supportato.
CLSCTX_FROM_DEFAULT_CONTEXT
Valore: 0x20000
Avvia questa attivazione dal contesto predefinito dell'apartment corrente.
CLSCTX_ACTIVATE_X86_SERVER
Valore: 0x40000
CLSCTX_ACTIVATE_32_BIT_SERVER
Attivare o connettersi a una versione a 32 bit del server; fail se non è registrato.
CLSCTX_ACTIVATE_64_BIT_SERVER
Valore: 0x80000
Attivare o connettersi a una versione a 64 bit del server; fail se non è registrato.
CLSCTX_ENABLE_CLOAKING
Valore: 0x100000
Quando viene specificato questo flag, COM usa il token di rappresentazione del thread, se presente, per la richiesta di attivazione effettuata dal thread. Quando questo flag non è specificato o se il thread non ha un token di rappresentazione, COM usa il token di processo del processo del thread per la richiesta di attivazione effettuata dal thread.


Windows Vista o versioni successive: Questo flag è supportato.
CLSCTX_APPCONTAINER
Valore: 0x400000
Indica che l'attivazione è per un contenitore di app.


Nota Questo flag è riservato per l'uso interno e non deve essere usato direttamente dal codice.

 
CLSCTX_ACTIVATE_AAA_AS_IU
Valore: 0x800000
Specificare questo flag per il comportamento di attivazione dell'utente interattivo per i server As-Activator. Un'app con nome fortemente denominato Medium IL Windows Store può usare questo flag per avviare un server COM "As Activator" senza un nome sicuro. È anche possibile usare questo flag per eseguire il binding a un'istanza in esecuzione del server COM avviato da un'applicazione desktop.

Il client deve essere Medium IL, deve essere fortemente denominato, il che significa che ha un SysAppID nel token client, non può essere nella sessione 0 e deve avere lo stesso utente dell'ID sessione nel token client.

Se il server è out-of-process e "As Activator", avvia il server con il token dell'utente sessione del token client. Questo token non sarà fortemente denominato.

Se il server è out-of-process e RunAs "Interactive User", questo flag non ha alcun effetto.

Se il server è out-of-process ed è qualsiasi altro tipo RunAs, l'attivazione ha esito negativo.

Questo flag non ha alcun effetto per i server in-process.

L'attivazione del computer non riesce quando usano questo flag.
CLSCTX_RESERVED6
Valore: 0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
Valore: 0x2000000
CLSCTX_PS_DLL
Valore: 0x80000000
Usato per il caricamento di DLL proxy/Stub.


Nota Questo flag è riservato per l'uso interno e non deve essere usato direttamente dal codice.

 

Commenti

I valori dell'enumerazione CLSCTX vengono usati nelle chiamate di attivazione (CoCreateInstance, CoCreateInstanceEx, CoGetClassObject e così via) per indicare i contesti di esecuzione preferiti (in-process, local o remote) in cui deve essere eseguito un oggetto. Vengono usati anche nelle chiamate a CoRegisterClassObject per indicare il set di contesti di esecuzione in cui un oggetto classe deve essere reso disponibile per le richieste per costruire istanze (IClassFactory::CreateInstance).

Per indicare che più di un contesto è accettabile, è possibile combinare più valori con le ORS booleane. I contesti vengono tentati nell'ordine in cui sono elencati.

Dato un set di flag CLSCTX , il contesto di esecuzione da usare dipende dalla disponibilità di codici di classe registrati e altri parametri in base all'algoritmo seguente.

  1. Se la chiamata specifica una delle seguenti, CLSCTX_REMOTE_SERVER è implicita e viene aggiunta all'elenco di flag:
    1. Struttura COSERVERINFO esplicita che indica un computer diverso dal computer corrente.
    2. Nessuna struttura COSERVERINFO esplicita specificata, ma la classe specificata viene registrata con il valore del Registro di sistema RemoteServerName o ActivateAtStorage .
    Il secondo caso consente alle applicazioni scritte prima del rilascio di COM distribuite di essere la configurazione delle classi per l'attivazione remota da usare dalle applicazioni client disponibili prima di DCOM e il flag di CLSCTX_REMOTE_SERVER. I casi in cui non esiste alcuna struttura COSERVERINFO esplicita sono quando il valore viene specificato come NULL o quando non è uno dei parametri della funzione , come nelle chiamate a CoCreateInstance e CoGetClassObject.
  2. Se il parametro COSERVERINFO esplicito indica il computer corrente, CLSCTX_REMOTE_SERVER viene rimosso se presente.
Il resto dell'elaborazione procede esaminando i valori nella sequenza seguente:
  1. Se i flag includono CLSCTX_REMOTE_SERVER e nessun parametro COSERVERINFO viene specificato e se la richiesta di attivazione indica uno stato persistente da cui inizializzare l'oggetto (con CoGetInstanceFromFile, CoGetInstanceFromIStorage o, per un moniker di file, in una chiamata a IMoniker::BindToObject) e la classe ha un TriggerAtStorageFromFile sottochiave o nessuna informazione del Registro di sistema di classi, la richiesta di attivazione e inizializzazione viene inoltrata al computer in cui risiede lo stato persistente. Fare riferimento alle funzioni di attivazione remota elencate nella sezione Vedere anche per informazioni dettagliate.
  2. Se i flag includono CLSCTX_INPROC_SERVER, il codice della classe nella DLL trovato nella chiave InprocServer32 della classe viene usato se questa chiave esiste. Il codice della classe verrà eseguito nello stesso processo del chiamante.
  3. Se i flag includono CLSCTX_INPROC_HANDLER, il codice della classe nella DLL trovato nella chiave InprocHandler32 della classe viene usato se questa chiave esiste. Il codice della classe verrà eseguito nello stesso processo del chiamante.
  4. Se i flag includono CLSCTX_LOCAL_SERVER, il codice della classe nel servizio trovato nella chiave LocalService della classe viene usato se questa chiave esiste. Se non viene specificato alcun servizio, ma viene specificato un exe nella stessa chiave, viene usato il codice di classe associato a tale exe. Il codice della classe (in entrambi i casi) verrà eseguito in un processo di servizio separato nello stesso computer del chiamante.
  5. Se il flag è impostato su CLSCTX_REMOTE_SERVER e un parametro COSERVERINFO aggiuntivo alla funzione specifica un determinato computer remoto, una richiesta di attivazione viene inoltrata a questo computer remoto con flag modificati per impostare su CLSCTX_LOCAL_SERVER. Il codice della classe verrà eseguito nel proprio processo in questo computer specifico, che deve essere diverso da quello del chiamante.
  6. Infine, se i flag includono CLSCTX_REMOTE_SERVER e non viene specificato alcun parametro COSERVERINFO e se viene specificato un nome computer sotto il valore RemoteServerName della classe, la richiesta di attivazione viene inoltrata a questo computer remoto con i flag modificati per essere impostati su CLSCTX_LOCAL_SERVER. Il codice della classe verrà eseguito nel proprio processo in questo computer specifico, che deve essere diverso da quello del chiamante.

CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER

Le versioni a 64 bit di Windows introducono due nuovi flag: CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER. In un computer a 64 bit, una versione a 32 bit e a 64 bit dello stesso server COM può coesistere. Quando un client richiede un'attivazione di un server out-of-process, questi flag CLSCTX consentono al client di specificare una versione a 32 bit o a 64 bit del server.

In genere, un client non si preoccupa se usa una versione a 32 bit o a 64 bit del server. Tuttavia, se il server stesso carica un server in-process aggiuntivo, e il server in-process deve essere entrambi a 32 bit o a 64 bit. Si supponga, ad esempio, che il client voglia usare un server "A", che a sua volta carica un server in-process "B". Se è disponibile solo una versione a 32 bit del server "B", il client deve specificare la versione a 32 bit del server "A". Se è disponibile solo una versione a 64 bit del server "B", il client deve specificare la versione a 64 bit del server "A".

Un server può specificare le proprie preferenze di architettura tramite la chiave del Registro di sistema PreferredServerBitness, ma la preferenza del client, specificata tramite un flag CLSCTX_ACTIVATE_32_BIT_SERVER o CLSCTX_ACTIVATE_64_BIT_SERVER, eseguirà l'override della preferenza del server. Se il client non specifica una preferenza, verrà usata la preferenza del server.

Se né il client né il server specificano una preferenza, quindi:

  • Se il computer che ospita il server esegue Windows Server 2003 con Service Pack 1 (SP1) o un sistema successivo, COM tenterà di corrispondere all'architettura del server all'architettura client. In altre parole, per un client a 32 bit, COM attiverà un server a 32 bit se disponibile; in caso contrario, attiverà una versione a 64 bit del server. Per un client a 64 bit, COM attiverà un server a 64 bit se disponibile; in caso contrario, attiverà un server a 32 bit.
  • Se il computer che ospita il server esegue Windows XP o Windows Server 2003 senza SP1 o versioni successive installate, COM preferisce una versione a 64 bit del server se disponibile; in caso contrario, attiverà una versione a 32 bit del server.
Se un'enumerazione CLSCTX ha sia il CLSCTX_ACTIVATE_32_BIT_SERVER che i flag di CLSCTX_ACTIVATE_64_BIT_SERVER impostati, non è valido e l'attivazione restituirà E_INVALIDARG.

La tabella seguente illustra i risultati delle varie combinazioni di architetture client e impostazioni client e architetture del server e impostazioni del server.

I flag CLSCTX_ACTIVATE_32_BIT_SERVER e CLSCTX_ACTIVATE_64_BIT_SERVER flusso attraverso i limiti del computer. Se il computer che ospita il server esegue Windows a 64 bit, il computer che ospita questi flag verrà rispettato; in caso contrario, verrà ignorata.

Client a 32 bit, nessun flag Client a 64 bit, nessun flag Client a 32 bit, flag a 32 bit¹ Client a 32 bit, flag a 64 bit² Client a 64 bit, flag a 32 bit¹ Client a 64 bit, flag a 64 bit²
Server a 32 bit, corrispondenza del valore del Registro di sistema client³ Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸
Server a 32 bit, valore del Registro di sistema a 32 bit⁴ Server a 32 bit Server a 32 bit Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸
Server a 32 bit, valore del Registro di sistema a 64 bit⁵ Vedere ⁸ Vedere ⁸ Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸
Server a 32 bit, nessun valore del Registro di sistema⁶ Server a 32 bit 64/32⁹ Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸
Server a 32 bit, nessun valore del Registro di sistema (prima di Windows Server 2003 con SP1)⁷ 64/32⁹ 64/32⁹ Server a 32 bit Vedere ⁸ Server a 32 bit Vedere ⁸
Server a 64 bit, corrispondenza del valore del Registro di sistema client³ Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit
Server a 64 bit, valore del Registro di sistema a 32 bit⁴ Vedere ⁸ Vedere ⁸ Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit
Server a 64 bit, valore del Registro di sistema a 64 bit⁵ Server a 64 bit Server a 64 bit Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit
Server a 64 bit, nessun valore del Registro di sistema⁶ 32/64¹¹ Server a 64 bit Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit
Server a 64 bit, nessun valore del Registro di sistema (prima di Windows Server 2003 con SP1)⁷ Server a 64 bit Server a 64 bit Vedere ⁸ Server a 64 bit Vedere ⁸ Server a 64 bit
 

PreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitness PreferredServerBitnessPreferredServerBitness

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Intestazione wtypesbase.h

Vedi anche

BIND_OPTS2

COSERVERINFO

Cocreateinstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

CoGetInstanceFromIStorage

CoRegisterClassObject

Creazione di un oggetto tramite un oggetto classe

IClassActivator::GetClassObject

Individuazione di un oggetto remoto

Registrazione di un server EXE in esecuzione