在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,第一部分
摘要
本文介绍如何通过将委托包装在 agile_ref 中来在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,并承诺在第二部分中提供更多细节。
<p>假设你有一些 C++/WinRT 代码,它从外部源接收一个委托,并且你可能在一个可能不同的 COM 上下文中调用该委托。然而,原始委托可能不是敏捷的。如何创建该委托的敏捷版本呢?</p>
<p>简单的方法是将委托包装在 <code>agile_<wbr />ref</code> 中,然后在需要调用时再将 <code>agile_<wbr />ref</code> 解析回委托。</p>
<pre>template<typename Delegate>
Delegate make_agile_delegate(Delegate const& d)
{
return [agile = winrt::agile_ref(d)](auto&&...args) {
return agile.get()(std::forward<decltype(args)>(args)...);
};
}
</pre>
<p>但如果这么简单,我们为什么要把这篇文章叫做“第一部分”呢?</p>
<p>更多内容请见第二部分。</p>
<p>本文《<a href="https://devblogs.microsoft.com/oldnewthing/20260720-00/?p=112545">在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,第一部分</a>》首发于 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。</p>
查看缓存全文
缓存时间: 2026/07/20 21:26
# 在 C++/WinRT 中创建 Windows 运行时委托的敏捷版本,第 1 部分 - 旧事新说
来源:https://devblogs.microsoft.com/oldnewthing/20260720-00?p=112545
假设你有一段 C++/WinRT 代码,从外部源接收一个委托,并且你可能需要在不同的 COM 上下文中调用该委托。然而,原始的委托可能不是敏捷的。如何创建该委托的敏捷版本?简单的方法是将委托包装在 `agile_ref` 中,然后在需要调用时再将 `agile_ref` 解析回委托。
`` template Delegate make_agile_delegate(Delegate const& d) { return [agile = winrt::agile_ref(d)](auto&&...args) { return agile.get()(std::forward(args)...); }; } ``
但如果真的这么简单,我们为什么还要把这篇文章称为“第 1 部分”呢?更多内容请见第 2 部分。
### 分类
### 主题
## 作者
Raymond Chen
Raymond 参与 Windows 发展已有 30 多年。2003 年,他创办了一个名为“The Old New Thing”的网站,其受欢迎程度远超他最狂野的想象,这一发展至今仍让他感到毛骨悚然。该网站后来催生了一本书,巧合的是,书名也是《The Old New Thing》(Addison Wesley 2007)。他偶尔会出现在 Windows Dev Docs 的 Twitter 账号上,讲述一些不传递任何有用信息的故事。
相似文章
在 C++/WinRT 中制作 Windows Runtime 委托的敏捷版本,第5部分
本文继续系列文章,介绍如何在 C++/WinRT 中实现敏捷委托,解决在正确上下文中销毁非敏捷委托的问题,方法是使用自定义删除器和 IContextCallback。
在C++/WinRT中创建Windows运行时代理的敏捷版本,第3部分
这篇博客文章讨论了在C++/WinRT中处理实现INoMarshal接口的Windows运行时代理,提供了一个敏捷的代理包装器,通过检查调用上下文来避免封送错误。
用C++/WinRT制作敏捷版Windows运行时委托,第4部分
本文讨论在C++/WinRT中实现敏捷的Windows运行时委托,重点介绍使用CoGetContextToken比较上下文令牌以提高效率,而不是比较COM对象。
如果C#和JavaScript允许我多次等待Windows Runtime异步操作,为什么C++/WinRT不行?
Raymond Chen解释了为什么C++/WinRT不像C#、JavaScript和Python那样允许多次等待异步操作,其原因是没有标准库的task类型,以及不为你未使用的功能付费的原则。
在多个协程之间共享单个Windows Runtime IAsyncOperation的结果,第3部分
本文讨论了一个C++/WinRT模式,用于缓存Windows Runtime IAsyncOperation的结果,包括处理失败的情况,以便多个协程可以共享缓存的结果或异常。