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

Windows runtime 如何从WinRT中的接口ID(IID)中找出类名?,windows-runtime,c++-winrt,Windows Runtime,C++ Winrt,我有一个基于BlankApp模板的XAML C++/WinRT应用程序。当我构建应用程序时,我意识到我的应用程序在我的输出窗口的幕后抛出了很多异常。我试图理解的例外情况如下: wzrd_editor.exe中0x00007FFA9EFA9149 KernelBase.dll处引发异常:WinRT原始错误-0x80040155:“未能找到IID的代理注册:{50F19C16-0A22-4D8E-A089-1EA9951657D2}。” 我一直在做的是打破WinRT源错误并查看调用堆栈。但是,我想知

我有一个基于BlankApp模板的XAML C++/WinRT应用程序。当我构建应用程序时,我意识到我的应用程序在我的输出窗口的幕后抛出了很多异常。我试图理解的例外情况如下:

wzrd_editor.exe中0x00007FFA9EFA9149 KernelBase.dll处引发异常:WinRT原始错误-0x80040155:“未能找到IID的代理注册:{50F19C16-0A22-4D8E-A089-1EA9951657D2}。”


我一直在做的是打破WinRT源错误并查看调用堆栈。但是,我想知道如何计算错误中显示的IID的类名?了解这些异常的来源似乎非常有用。也许我可以在注册表的某个地方找到答案?

这个问题将运行时类和接口这两个概念混为一谈。运行时类是通过一组接口实现的命名类型,其中一些接口可能是类所独有的,而另一些接口可能在许多类上实现

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

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

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

谢谢


Ben

这个问题将运行时类和接口这两个概念混为一谈。运行时类是通过一组接口实现的命名类型,其中一些接口可能是类所独有的,而另一些接口可能在许多类上实现

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

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

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

谢谢


Ben

这里的根本问题是Xaml委托有点简单,即Xaml实现的用于订阅应用程序引发的事件的委托。尽管它们非常敏捷,但它们既不实现IAgileObject,也不实现IMarshal。语言投影无法在不进行探测的情况下了解委托的任何信息,这会导致调试器中出现噪音,尽管这不是由异常引起的,而是由对RoOriginateXxx的调用引起的


C++/WinRT仅存储敏捷委托以确保单元的正确性。然后,它必须在Xaml实现中绕过这个限制,首先通过查询IAgileObject来检查委托是否灵活。如果失败,它将尝试创建一个敏捷引用,以容纳像JavaScript创建的那些可编组委托。如果此操作失败,它会将委托私运,因为没有其他选择。这是最后一类Xaml,但这意味着调试器将报告任何Xaml提供的委托的“找不到IID的代理注册”错误。

这里的根本问题是Xaml委托有点简单,Xaml实现的委托用于订阅应用程序引发的事件。尽管它们非常敏捷,但它们既不实现IAgileObject,也不实现IMarshal。语言投影无法在不进行探测的情况下了解委托的任何信息,这会导致调试器中出现噪音,尽管这不是由异常引起的,而是由对RoOriginateXxx的调用引起的

C++/WinRT仅存储敏捷委托以确保单元的正确性。然后,它必须在Xaml实现中绕过这个限制,首先通过查询IAgileObject来检查委托是否灵活。如果失败了,它会尝试创建一个敏捷参考 e来容纳像JavaScript创建的那些可封送的委托。如果此操作失败,它会将委托私运,因为没有其他选择。这是最后一类Xaml,但这意味着调试器将为任何Xaml提供的委托报告“找不到IID的代理注册”错误