创建一个假敏捷包装器:技术上敏捷,但在其所属单元之外毫无用处(第 1 部分)

The Old New Thing (Raymond Chen) 新闻

摘要

Raymond Chen 介绍了一种在 COM 中创建假敏捷包装器的技术,该技术利用全局接口表(GIT)在对象所在的源单元关闭时自动释放对象,从而解决了上下文回调失败的问题。

<p>上次,<a title="在 C++/WinRT 中创建 Windows 运行时委托的敏捷版本,第 10 部分" href="https://devblogs.microsoft.com/oldnewthing/20260731-00/?p=112578">我们讨论了上下文回调失败意味着什么</a>,它使我们无法在原始上下文中释放对象。我们指出,问题在于当原始单元关闭时,我们失去了释放对象的机会。</p> <p>我们想要的是介于强引用和弱引用之间的东西。我们想要一个强引用,但在源单元关闭时,它会释放对目标的引用。</p> <p>有这样的东西吗?</p> <p>事实证明,确实有。</p> <p>我们可以做的是将对象注册到全局接口表(历史上称为 GIT,与源代码管理系统无关)。这样做的通常原因是允许通过兑换注册 cookie 从另一个单元访问该对象。我们无意从另一个单元访问该对象,但我们这样做是为了利用 GIT 的一个特性:当对象所在的单元关闭时,GIT 中的引用会自动释放。注册 cookie 仍然有效,但如果你试图兑换它,你会被告知服务器不再可用。</p> <p>因此,这里的想法是将原始委托注册到 GIT 中,并将其保存在敏捷包装器中。然后,敏捷包装器在销毁时取消注册该委托。我们从不兑换注册 cookie。注册该委托的目的不是从另一个单元访问它,而是为了在原始单元关闭时自动释放它。</p> <p>那么,让我们试试吧。</p> <p>下次继续。</p> <p>这篇博文 <a href="https://devblogs.microsoft.com/oldnewthing/20260803-00/?p=112582">创建一个假敏捷包装器:技术上敏捷,但在其所属单元之外毫无用处(第 1 部分)</a> 首发于 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。</p>
查看原文
查看缓存全文

缓存时间: 2026/08/04 13:31

# 创建一个假的敏捷包装器:它在技术上是敏捷的,但在其原始单元之外毫无用处,第1部分 - The Old New Thing 来源:https://devblogs.microsoft.com/oldnewthing/20260803-00?p=112582 2026年8月3日 celebrate1 reaction 上次,我们讨论了当上下文回调失败(https://devblogs.microsoft.com/oldnewthing/20260731-00/?p=112578)时意味着什么,它使我们无法在原始上下文中释放对象。我们指出,问题在于当原始单元关闭时,我们也就失去了释放对象的机会。 我们想要的是介于强引用和弱引用之间的某种东西。我们想要一个强引用,但在来源单元关闭时,它会释放对目标的引用。 有这样的东西吗? 事实证明,确实有。 我们可以做的,是将对象注册到全局接口表(历史上称为GIT,与源代码控制系统无关)。通常这样做是为了通过兑现注册cookie来允许从另一个单元访问该对象。我们并不打算从另一个单元访问对象,而是想利用GIT的一个特性:当对象的单元关闭时,GIT中的引用会被自动释放。注册cookie仍然有效,但如果你试图兑现它,你会被告知服务器已不再可用。 所以这里的想法是,将原始委托注册到GIT中,并把它保存在敏捷包装器里。之后,敏捷包装器在销毁时取消注册该委托。我们从不兑现注册cookie。注册委托的目的不是从另一个单元访问它,而仅仅是在原始单元关闭时自动释放它。 那么让我们试一试。 下次再说。 ### 类别 ### 主题 ## 作者 Raymond Chen Raymond 参与 Windows 的演进已有30多年。2003年,他创建了一个名为 The Old New Thing 的网站,其受欢迎程度远远超出了他最狂野的想象,这一发展至今仍让他感到不寒而栗。该网站还衍生了一本书,书名也恰好是 The Old New Thing(Addison Wesley 2007)。他偶尔会出现在 Windows Dev Docs 的 Twitter 账户上,讲述一些毫无信息量的故事。 ## 接下来阅读 ## 保持关注 在新文章发布时获得通知。 关注此博客 - https://twitter.com/ChenCravat - youtube (https://www.youtube.com/playlist?list=PLlrxD0HtieHge3_8Dm48C0Ns61I6bHThc) - https://github.com/oldnewthing - https://devblogs.microsoft.com/oldnewthing/feed/

相似文章