활성화 컨텍스트 API 사용

애플리케이션은 활성화 컨텍스트 함수를 직접 호출하여 활성화 컨텍스트를 관리할 수 있습니다. 활성화 컨텍스트는 메모리의 데이터 구조입니다. 시스템은 활성화 컨텍스트의 정보를 사용하여 특정 DLL 버전, COM 개체 instance 또는 사용자 지정 창 버전을 로드하도록 애플리케이션을 리디렉션할 수 있습니다. 자세한 내용은 활성화 컨텍스트 참조를 참조하세요.

API(애플리케이션 프로그래밍 인터페이스)를 사용하여 활성화 컨텍스트를 관리하고 매니페스트를 사용하여 버전 이름이 지정된 개체를 만들 수 있습니다. 다음 두 시나리오에서는 애플리케이션이 활성화 컨텍스트 함수를 직접 호출하여 활성화 컨텍스트를 관리하는 방법을 보여 줍니다. 그러나 대부분의 경우 활성화 컨텍스트는 시스템에서 관리됩니다. 애플리케이션 개발자와 어셈블리 공급자는 일반적으로 활성화 컨텍스트를 관리하기 위해 스택을 호출할 필요가 없습니다.

  • 간접 또는 디스패치 계층을 구현하는 프로세스 및 애플리케이션.

    예를 들어 사용자가 이벤트 루프에서 활성화 컨텍스트를 관리합니다. 창 위로 마우스를 이동하는 등 창에 액세스할 때마다 ActivateActCtx 가 호출되어 다음 코드 조각과 같이 리소스에 대한 현재 활성화 컨텍스트를 활성화합니다.

HANDLE hActCtx;  
CreateWindow();  
...  
GetCurrentActCtx(&ActCtx);  
...  
ReleaseActCtx(&ActCtx);  

다음 코드 조각에서 API 함수는 CallWindowProc을 호출하기 전에 적절한 활성화 컨텍스트를 활성화합니다. CallWindowProc이 호출되면 이 컨텍스트를 사용하여 Windows에 메시지를 전달합니다. 모든 리소스 작업이 완료되면 함수는 컨텍스트를 비활성화합니다.

ULONG_PTR ulpCookie;  
HANDLE hActCtx;  
if(ActivateActCtx(hActCtx, &ulpCookie))  
{  
    ...  
    CallWindowProc(...);  
    ...  
    DeactivateActCtx(0, ulpCookie);  
}
  • 위임자 디스패치 계층.

    이 시나리오는 드라이버 관리자와 같은 공통 API 계층을 사용하여 여러 엔터티를 관리하는 관리자에게 적용됩니다. 아직 구현되지 않았지만 이 예제는 ODBC 드라이버입니다.

    이 시나리오에서 중간 계층은 어셈블리 바인딩을 처리할 수 있게 됩니다. 버전별 바인딩 드라이버를 얻으려면 게시자는 매니페스트를 제공하고 해당 매니페스트의 특정 구성 요소에 대한 종속성을 지정해야 합니다. 기본 애플리케이션은 구성 요소에 동적으로 바인딩되지 않습니다. 런타임에 드라이버 관리자가 호출을 관리합니다. 연결 문자열에 따라 ODBC 드라이버가 호출되면 적절한 드라이버를 로드합니다. 그런 다음 어셈블리 매니페스트 파일의 정보를 사용하여 활성화 컨텍스트를 만듭니다.

    매니페스트가 없으면 드라이버의 기본 작업은 애플리케이션에서 지정한 것과 동일한 컨텍스트를 사용하는 것입니다. 이 예제에서는 MSVCRT 버전 2입니다. 매니페스트가 존재하므로 별도의 활성화 컨텍스트가 설정됩니다. ODBC 드라이버가 실행되면 MSVCRT 어셈블리 버전 1에 바인딩됩니다.

    드라이버 관리자가 디스패치 계층을 호출할 때마다(예: 다음 데이터 집합 가져오기) 활성화 컨텍스트에 따라 적절한 어셈블리를 사용합니다. 다음 코드 조각에서는 이를 보여 줍니다.

HANDLE hActCtx;  
ULONG_PTR ulpCookie;  
ACTCTX ActCtxToCreate = {...};  
hActCtx = CreateActCtx(&ActCtxToCreate);  
...;  
if (ActivateActCtx(hActCtx, &ulpCookie))  
{  
    ...  
    ConnectDb(...);  
    DeactivateActCtx(0, ulpCookie);  
}  
... 
ReleaseActCtx(hActCtx);