CLSCTX 열거형(wtypesbase.h)

활성화 호출에 사용되는 값은 개체를 실행할 실행 컨텍스트를 나타냅니다. 이러한 값은 CoRegisterClassObject 를 호출하는 데도 사용되어 인스턴스 생성 요청에 클래스 개체를 사용할 수 있는 실행 컨텍스트 집합을 나타냅니다.

Syntax

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
이 클래스의 개체를 관리하는 코드는 in-process 처리기입니다. 이는 클라이언트 프로세스에서 실행되고 클래스의 인스턴스가 원격으로 액세스할 때 이 클래스의 클라이언트 쪽 구조를 구현하는 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
디렉터리 서비스 또는 인터넷에서 코드 다운로드를 사용하지 않도록 설정합니다. 이 플래그는 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(Activate-As-Activator) 활성화를 사용하지 않도록 설정합니다. 이 플래그는 EOLE_AUTHENTICATION_CAPABILITIES 열거형에서 EOAC_DISABLE_AAA 플래그의 설정을 재정의합니다. 이 플래그는 CLSCTX_ENABLE_AAA 동시에 설정할 수 없습니다. 서버 프로세스가 호출자의 ID로 시작되는 모든 활성화를 AAA(activat-as-activator) 활성화라고 합니다. AAA 활성화를 사용하지 않도록 설정하면 권한 있는 계정(예: LocalSystem)으로 실행되는 애플리케이션이 해당 ID가 신뢰할 수 없는 구성 요소를 시작하는 데 사용되지 않도록 방지할 수 있습니다. 활성화 호출을 사용하는 라이브러리 애플리케이션은 해당 호출 중에 항상 이 플래그를 설정해야 합니다. 이렇게 하면 라이브러리 애플리케이션이 권한 상승 보안 공격에 사용되지 않도록 방지할 수 있습니다. EOLE_AUTHENTICATION_CAPABILITIES 열거형의 EOAC_DISABLE_AAA 플래그가 라이브러리 애플리케이션이 아닌 서버 프로세스에만 적용되므로 라이브러리 애플리케이션에서 AAA 활성화를 사용하지 않도록 설정하는 유일한 방법입니다.

Windows 2000: 이 플래그는 지원되지 않습니다.
CLSCTX_ENABLE_AAA
값: 0x10000
이 활성화에 대해서만 AAA(Activate-As-Activator) 활성화를 사용하도록 설정합니다. 이 플래그는 EOLE_AUTHENTICATION_CAPABILITIES 열거형에서 EOAC_DISABLE_AAA 플래그의 설정을 재정의합니다. 이 플래그는 CLSCTX_DISABLE_AAA 동시에 설정할 수 없습니다. 서버 프로세스가 호출자의 ID로 시작되는 모든 활성화를 AAA(activat-as-activator) 활성화라고 합니다. 이 플래그를 사용하도록 설정하면 애플리케이션이 해당 ID를 활성화된 구성 요소로 전송할 수 있습니다.

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 서버의 실행 중인 instance 바인딩할 수 있습니다.

클라이언트는 중간 IL이어야 하며, 강력한 이름을 지정해야 합니다. 즉, 클라이언트 토큰에 SysAppID가 있고 세션 0에 있을 수 없으며 클라이언트 토큰의 세션 ID 사용자와 동일한 사용자가 있어야 합니다.

서버가 out-of-process이고 "As Activator"인 경우 클라이언트 토큰의 세션 사용자의 토큰을 사용하여 서버를 시작합니다. 이 토큰의 이름은 강력하게 지정되지 않습니다.

서버가 out-of-process이고 RunAs "Interactive User"인 경우 이 플래그는 영향을 주지 않습니다.

서버가 out-of-process이고 다른 RunAs 유형인 경우 활성화가 실패합니다.

이 플래그는 In-Process 서버에 영향을 주지 않습니다.

이 플래그를 사용하면 컴퓨터에서 벗어난 활성화가 실패합니다.
CLSCTX_RESERVED6
값: 0x1000000
CLSCTX_ACTIVATE_ARM32_SERVER
값: 0x2000000
CLSCTX_PS_DLL
값: 0x80000000
프록시/스텁 DLL을 로드하는 데 사용됩니다.


참고 이 플래그는 내부용으로 예약되어 있으며 코드에서 직접 사용하기 위한 것이 아닙니다.

 

설명

CLSCTX 열거형의 값은 활성화 호출(CoCreateInstance, CoCreateInstanceEx, CoGetClassObject 등)에서 개체를 실행할 기본 실행 컨텍스트(In-process, local 또는 remote)를 나타내는 데 사용됩니다. 또한 CoRegisterClassObject 호출에서 클래스 개체를 인스턴스 생성 요청에 사용할 수 있는 실행 컨텍스트 집합을 나타내는 데도 사용됩니다(IClassFactory::CreateInstance).

둘 이상의 컨텍스트가 허용 가능함을 나타내기 위해 여러 값을 부울 OU와 결합할 수 있습니다. 컨텍스트는 나열된 순서대로 시도됩니다.

CLSCTX 플래그 집합이 지정된 경우 사용할 실행 컨텍스트는 다음 알고리즘에 따라 등록된 클래스 코드 및 기타 매개 변수의 가용성에 따라 달라집니다.

  1. 호출이 다음 중 하나를 지정하는 경우 CLSCTX_REMOTE_SERVER 암시되고 플래그 목록에 추가됩니다.
    1. 현재 컴퓨터와 다른 컴퓨터를 나타내는 명시적 COSERVERINFO 구조체입니다.
    2. 명시적 COSERVERINFO 구조가 지정되지 않았지만 지정된 클래스는 RemoteServerName 또는 ActivateAtStorage 레지스트리 값으로 등록됩니다.
    두 번째 사례에서는 분산 COM 릴리스 전에 작성된 애플리케이션이 DCOM 및 CLSCTX_REMOTE_SERVER 플래그 이전에 사용할 수 있는 클라이언트 애플리케이션에서 사용할 원격 활성화를 위한 클래스의 구성이 될 수 있습니다. 명시적 COSERVERINFO 구조체가 없는 경우는 값이 NULL 로 지정되거나 함수 매개 변수 중 하나가 아닌 경우입니다( CoCreateInstanceCoGetClassObject 호출에서와 같이).
  2. 명시적 COSERVERINFO 매개 변수가 현재 컴퓨터를 나타내는 경우 CLSCTX_REMOTE_SERVER 제거됩니다.
나머지 처리는 다음 시퀀스에서 값을 확인하여 진행됩니다.
  1. 플래그에 CLSCTX_REMOTE_SERVER 포함되고 COSERVERINFO 매개 변수가 지정되지 않은 경우 및 활성화 요청이 개체를 초기화할 영구 상태를 나타내는 경우( CoGetInstanceFromFile, CoGetInstanceFromIStorage 사용) 또는 파일 모니커의 경우 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비트 버전이 공존할 수 있습니다. 클라이언트가 Out-of-process 서버의 활성화를 요청하는 경우 이러한 CLSCTX 플래그를 사용하면 클라이언트가 32비트 또는 64비트 버전의 서버를 지정할 수 있습니다.

일반적으로 클라이언트는 32비트 또는 64비트 버전의 서버를 사용하는지 여부에 상관하지 않습니다. 그러나 서버 자체가 추가 in-process 서버를 로드하는 경우 서버와 In-process 서버는 모두 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 SP1(서비스 팩 1) 이상 시스템을 실행하는 경우 COM은 서버 아키텍처를 클라이언트 아키텍처와 일치시키려고 시도합니다. 즉, 32비트 클라이언트의 경우 COM은 사용 가능한 경우 32비트 서버를 활성화합니다. 그렇지 않으면 64비트 버전의 서버를 활성화합니다. 64비트 클라이언트의 경우 COM은 사용 가능한 경우 64비트 서버를 활성화합니다. 그렇지 않으면 32비트 서버를 활성화합니다.
  • 서버를 호스트하는 컴퓨터가 SP1 이상을 설치하지 않고 Windows XP 또는 Windows Server 2003을 실행하는 경우 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비트 flag²
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비트 서버
 

PreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitnessPreferredServerBitness PreferredServerBitness

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
머리글 wtypesbase.h

참고 항목

BIND_OPTS2

COSERVERINFO

CoCreateInstance

CoCreateInstanceEx

CoGetClassObject

CoGetInstanceFromFile

CoGetInstanceFromIStorage

CoRegisterClassObject

클래스 개체를 통해 개체 만들기

IClassActivator::GetClassObject

원격 개체 찾기

실행 중인 EXE 서버 등록