共用方式為


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
停用從目錄服務或因特網下載程序代碼。 此旗標不能與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 = 任意記錄。 根據預設,記錄檔,但用戶端可以在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
從目前 Apartment 的預設內容開始此啟用。
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 伺服器的互動式使用者啟用行為指定此旗標。 強名稱的 Medium IL Windows 市集應用程式可以使用此旗標來啟動不含強名稱的「啟動器」COM 伺服器。 此外,您可以使用此旗標系結至傳統型應用程式所啟動之 COM 伺服器的執行中實例。

客戶端必須是 Medium IL,它必須具有強名稱,這表示它在用戶端令牌中具有 SysAppID,它不能位於會話 0 中,而且它必須有與用戶端令牌中會話標識碼的使用者相同的使用者。

如果伺服器處於進程外和「啟用者」,則會使用用戶端令牌會話使用者的令牌啟動伺服器。 此令牌不會以強名稱命名。

如果伺服器處於跨進程且 RunAs「互動式使用者」,則此旗標沒有任何作用。

如果伺服器已跨進程且為任何其他 RunAs 類型,則啟用會失敗。

此旗標對進程內伺服器沒有任何作用。

使用這個旗標時,離線啟用會失敗。
CLSCTX_RESERVED6
值:0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
值:0x2000000
CLSCTX_PS_DLL
值:0x80000000
用於載入 Proxy/Stub DLL。

附註 此旗標保留供內部使用,並不適合直接從您的程式代碼使用。

言論

來自 CLSCTX 列舉的值會用於啟用呼叫中(CoCreateInstanceCoCreateInstanceExCoGetClassObject等等),以指出對象執行慣用的執行內容(同進程、本機或遠端)。 它們也會用於呼叫 CoRegisterClassObject,以指出類別物件可供建構實例的要求使用的一組執行內容(IClassFactory::CreateInstance)。

若要指出可以接受多個內容,您可以將多個值與布爾值結合。 內容會依照列出的順序進行嘗試。

假設有一組 CLSCTX 旗標,要使用的執行內容會根據下列演算法的已註冊類別代碼和其他參數的可用性而定。

  1. 如果呼叫指定下列其中一項,則會隱含CLSCTX_REMOTE_SERVER並新增至旗標清單:
    1. 明確 COSERVERINFO 結構,表示計算機與目前電腦不同。
    2. 未指定明確 COSERVERINFO 結構,但指定的類別會向 RemoteServerNameActivateAtStorage 登錄值註冊。
    第二種情況可讓在發行分散式 COM 之前撰寫的應用程式設定為在DCOM和 CLSCTX_REMOTE_SERVER旗標之前可用的用戶端應用程式使用遠端啟用的類別組態。 沒有明確 COSERVERINFO 結構的情況是當值指定 為 NULL,或當它不是其中一個函式參數時(如 呼叫 coCreateInstanceCoGetClassObject)。
  2. 如果明確 COSERVERINFO 參數指出目前的計算機,則CLSCTX_REMOTE_SERVER如果存在,則會移除。
其餘的處理會依下列順序查看 value(s) 來繼續進行:
  1. 如果旗標包含 CLSCTX_REMOTE_SERVER,且未指定任何 COSERVERINFO 參數,而且啟用要求指出初始化物件的永續性狀態(CoGetInstanceFromFileCoGetInstanceFromIStorage或 對於檔案Moniker,在呼叫 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 位伺服器

要求

要求 價值
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
支援的最低伺服器 Windows 2000 Server [僅限傳統型應用程式]
標頭 wtypesbase.h

另請參閱

BIND_OPTS2

COSERVERINFO

CoCreateInstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

CoGetInstanceFromIStorage

CoRegisterClassObject

透過類別物件建立物件

IClassActivator::GetClassObject

尋找遠端物件

註冊執行中的EXE Server