如何从WinRT中的接口ID(IID)找出类名?

时间:2019-04-10 02:04:42

标签: 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的类名?知道找出这些异常的来源似乎很有用。也许注册表中可以找到某个地方?

2 个答案:

答案 0 :(得分:2)

这里的根本问题是Xaml委托有点简单(Xaml实施以订阅应用程序引发的事件的委托)。即使它们有效地敏捷,它们也不实现IAgileObject或IMarshal。语言投影无法不进行探测就对委托有任何了解,这会导致调试器产生噪音,尽管这不是由异常引起的,而是由对RoOriginateXxx的调用引起的。

C ++ / WinRT仅存储敏捷委托以确保公寓的正确性。然后,它必须通过首先检查委托是否敏捷(通过查询IAgileObject)来解决Xaml实现中的此限制。如果失败,它将尝试创建一个敏捷引用(以容纳可编组的委托,例如由JavaScript创建的委托)。如果失败,那么它将走私代表,因为没有其他选择。这是容纳Xaml的最后一个类别,但这意味着调试器将为Xaml提供的任何委托报告“无法为IID查找代理注册”错误。

答案 1 :(得分:1)

该问题概括了两个概念,运行时类和接口。运行时类是通过一组接口实现的命名类型,其中某些接口可能是该类所独有的,而其他接口则可以在许多类上实现。

对于系统类型,SDK中的C ++标头将包含所有公共和私有接口的定义,您可以在它们中搜索GUID以映射回该类。尽管有时接口也可能会在名称中出现在注册表中,但这不能保证。

我进行了快速搜索,可以看到错误中提到的接口是Windows.UI.Xaml.IPropertyChangedEventHandler,它是委托人PropertyChangedEventHandler的基础接口。由于这是XAML的一部分,因此期望这些接口应由敏捷对象实现,并且应始终在UI线程上调用。

该错误表明您的非敏捷代表已在一个公寓中注册,并在另一个公寓中被调用。您可以通过使委托敏捷或通过在UI线程上创建并注册它来解决此问题。

谢谢