mbl*_*mbl 5 windows-runtime c++-winrt
我有一个基于 BlankApp 模板的 XAML C++/WinRT 应用程序。当我构建应用程序时,我意识到我的应用程序在输出窗口中在幕后抛出了很多异常。我试图理解的例外情况如下:
Exception thrown at 0x00007FFA9EFA9149 (KernelBase.dll) in wzrd_editor.exe: WinRT originate error - 0x80040155 : 'Failed to find proxy registration for IID: {50F19C16-0A22-4D8E-A089-1EA9951657D2}.'.
我一直在做的是打破 WinRT 引发的错误并查看调用堆栈。但是我想知道如何找出错误中显示的 IID 的类名?了解这些异常的来源似乎非常有用。也许注册表中的某个地方我可以找到?
这里的根本问题是 Xaml 委托有点简单(Xaml 实现的委托用于订阅应用程序引发的事件)。尽管它们实际上是敏捷的,但它们既没有实现 IAgileObject 也没有实现 IMarshal。语言投影无法在不进行探测的情况下了解委托的任何信息,这会导致调试器中出现噪音,尽管这不是由异常引起的,而是由对 RoOriginateXxx 的调用引起的。
\n\nC++/WinRT 仅存储敏捷委托以确保单元正确性。然后,它必须首先检查委托是否敏捷(通过查询 IAgileObject)来解决 Xaml 实现中的此限制。如果失败,它会尝试创建一个敏捷引用(以容纳可编组委托,如 JavaScript 创建的委托)。如果失败,它会走私委托,因为\xe2\x80\x99s没有其他选择。\xe2\x80\x99 是容纳 Xaml 的最后一个类别,但这意味着调试器将为任何 Xaml 提供的委托报告 \xe2\x80\x9cFailed to find proxy Registration for IID\xe2\x80\x9d 错误。
\n小智 4
这个问题混淆了两个概念:运行时类和接口。运行时类是通过一组接口实现的命名类型,其中一些接口可能是该类所独有的,而另一些接口可能在许多类上实现。
对于系统类型,SDK 中的 C++ 标头将包含所有接口(公共和私有)的定义,您可以在它们中搜索 GUID 以映射回类。尽管有时接口也可能会以名称出现在注册表中,但这并不能保证。
我快速搜索了一下,可以看到错误中提到的接口是Windows.UI.Xaml.IPropertyChangedEventHandler,这是 delegate 的底层接口PropertyChangedEventHandler。由于这是 XAML 的一部分,因此期望这些接口应由敏捷对象实现,并且应始终在 UI 线程上调用。
该错误表明您的非敏捷委托要么在一间公寓中注册,要么在另一间公寓中调用。您可以通过使委托变得敏捷或在 UI 线程上创建并注册它来解决此问题。
谢谢,
本
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |