使用激活上下文 API

应用程序可以通过直接调用 激活上下文 函数来管理激活上下文。 激活上下文是内存中的数据结构。 系统可以使用激活上下文中的信息重定向应用程序,以加载特定的 DLL 版本、COM 对象实例或自定义窗口版本。 有关详细信息,请参阅 激活上下文参考

应用程序编程接口 (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);