Making an agile version of a Windows Runtime delegate in C++/WinRT, part 1 - The Old New Thing2 months agohttps://devblogs.microsoft.com/oldnewthing/20260720-00/?p=112545问题:来自外部源的 C++/WinRT 委托可能不具备敏捷性,导致从不同 COM 上下文调用时出现问题。一个简单的解决方案是将委托包装在 winrt::agile_ref 中,然后在调用时使用 lambda 函数将其解析回委托。提供的模板函数 make_agile_delegate 捕获 agile_ref 并使用转发的参数调用其 get() 方法。文章暗示这只是一个部分解决方案,更多细节将在第 2 部分中介绍。
Making an agile version of a Windows Runtime delegate in C++/WinRT, part 5 - The Old New Thing2 months agohttps://devblogs.microsoft.com/oldnewthing/20260724-00/?p=112562不可封送处理的委托必须在其原始上下文中销毁,以避免线程问题(非线程安全的引用计数、错误的线程销毁)。自定义删除器(in_context_deleter)会捕获原始上下文,并在释放委托之前使用 IContextCallback::ContextCallback 切换上下文。make_agile_delegate 函数处理三种情况:敏捷对象、不可封送处理(使用自定义删除器)以及其他情况(使用 agile_ref)。IContextCallback 调用可能会失败,因此删除器无法保证绝对可靠;需要进一步改进。