Uso de la API de contexto de activación

Las aplicaciones pueden administrar un contexto de activación llamando directamente a las funciones de contexto de activación. Los contextos de activación son estructuras de datos en memoria. El sistema puede usar la información en el contexto de activación para redirigir una aplicación para cargar una versión dll determinada, una instancia de objeto COM o una versión de ventana personalizada. Para obtener más información, vea Referencia de contexto de activación.

La interfaz de programación de aplicaciones (API) se puede usar para administrar el contexto de activación y crear objetos con nombre de versión con manifiestos. En los dos escenarios siguientes se muestra cómo una aplicación puede administrar un contexto de activación llamando directamente a las funciones de contexto de activación. Sin embargo, en la mayoría de los casos, el sistema administra el contexto de activación. Normalmente, los desarrolladores de aplicaciones y los proveedores de ensamblados no necesitan realizar llamadas a la pila para administrar el contexto de activación.

  • Procesos y aplicaciones que implementan capas de distribución o direccionamiento indirecto.

    Por ejemplo, un usuario que administra contextos de activación en el bucle de eventos. Cada vez que se accede a la ventana, como al mover el mouse sobre la ventana, se llama a ActivateActCtx , que activa el contexto de activación actual del recurso, como se muestra en el siguiente fragmento de código.

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

En el fragmento de código siguiente, la función de API activa los contextos de activación adecuados antes de llamar a CallWindowProc. Cuando se llama a CallWindowProc , usa este contexto para pasar un mensaje a Windows. Cuando se hayan completado todas las operaciones de recursos, la función desactivará el contexto.

ULONG_PTR ulpCookie;  
HANDLE hActCtx;  
if(ActivateActCtx(hActCtx, &ulpCookie))  
{  
    ...  
    CallWindowProc(...);  
    ...  
    DeactivateActCtx(0, ulpCookie);  
}
  • Capa de distribución del delegado.

    Este escenario se aplica a los administradores que administran varias entidades con una capa de API común, como un administrador de controladores. Aunque aún no se ha implementado, un ejemplo de esto sería el controlador ODBC.

    En este escenario, la capa central se vuelve capaz de procesar enlaces de ensamblado. Para obtener el controlador de enlace específico de la versión, los publicadores deben proporcionar un manifiesto y especificar las dependencias de componentes específicos de ese manifiesto. La aplicación base no se enlaza dinámicamente a los componentes; en tiempo de ejecución, el administrador de controladores administra las llamadas. Cuando se llama al controlador ODBC en función de la cadena de conexión, carga el controlador adecuado. A continuación, crea el contexto de activación mediante la información del archivo de manifiesto del ensamblado.

    Sin el manifiesto, la acción predeterminada para el controlador es usar el mismo contexto que el especificado por la aplicación, en este ejemplo, versión 2 de MSVCRT. Dado que existe un manifiesto, se establece un contexto de activación independiente. Cuando se ejecuta el controlador ODBC, se enlaza a la versión 1 del ensamblado MSVCRT.

    Cada vez que el administrador de controladores llama a la capa de distribución (por ejemplo, para obtener el siguiente conjunto de datos), usa los ensamblados adecuados en función del contexto de activación. El fragmento de código siguiente ilustra esto.

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