激活上下文允许使用 COM 对象,而无需注册它们。 这样,应用程序就可以基于其版本而不是注册表信息具有具有不同功能的多个组件。 多个组件可能使用相同的 GUID 暴露同一个 COM 对象,但根据版本可能具有不同的功能。
当应用程序从 CLSIDFromProgID请求 GUID 时,COM 首先在活动激活上下文中搜索从 progid 到 CLSID 的映射。 当应用程序使用 CoCreateInstance 获取实例接口指针时,COM 会在活动激活上下文中搜索以查找将承载 CLSID 的 DLL。 如果激活上下文不包含所需的信息,COM 将使用常规方法搜索注册表中的信息。
请注意,由于激活上下文是按线程分配的,COM 会将创建线程的激活上下文封送到主机线程,并在主机线程上调用 LoadLibrary 或 DllGetClassObject 之前激活它。 此功能已存在于 Windows 中,不需要客户端代码执行任何作即可实现此功能。
COM 类可由托管组件导出,而无需通过注册表。 多个组件可以为不同的 COM 对象公开相同的 ProgID,并且宿主应用程序应仅找到正确的激活上下文,然后使用 CLSIDFromProgID 和 CoCreateInstance 来获取托管对象的接口指针。