Visual c++ 创建从另一个(简单)接口继承的简单接口时出现错误MIDL5004

Visual c++ 创建从另一个(简单)接口继承的简单接口时出现错误MIDL5004,visual-c++,windows-runtime,midl,wrl,Visual C++,Windows Runtime,Midl,Wrl,我有以下非常简单的界面: [uuid(0d585932-fbc4-4b0a-90b5-ccf34aefd4c6)] [version(COMPONENT_VERSION)] interface IPerson : IInspectable { [propget] HRESULT Name([out, retval] HSTRING* value); [propput] HRESULT Name([in] HSTRING value); [propget] HRESU

我有以下非常简单的界面:

[uuid(0d585932-fbc4-4b0a-90b5-ccf34aefd4c6)] 
[version(COMPONENT_VERSION)] 
interface IPerson : IInspectable
{
    [propget] HRESULT Name([out, retval] HSTRING* value);
    [propput] HRESULT Name([in] HSTRING value);

    [propget] HRESULT Surname([out, retval] HSTRING* value);
    [propput] HRESULT Surname([in] HSTRING value);
}

[uuid(863571FC-4CBB-47E8-8BD3-2709D5CB7D0D)]
[version(COMPONENT_VERSION)]
interface ICitizen : IPerson 
{
[propget] HRESULT Address([out, retval] IAddress** value);
[propput] HRESULT Address([in] IAddress* value);
}
当我尝试为WinRT编译此MIDL时,出现以下错误:

错误MIDL5004:接口必须从IInspectable:ICitizen继承

我真的对WinRT下COM的发展感到困惑!如果像从另一个接口继承这样简单的事情不再可能,我们如何用它来设计应用程序呢

我已经搜索了WinRT的MIDL文档,但找不到!!更好的是,在谷歌上搜索错误MIDL5004不会显示任何结果

微软的任何人都可以解释一下如何创建一个从IInspectable继承的接口。 在另一个测试中,我用C++/CX创建了相同的接口,并且我能够创建一个从IPerson继承的ICitizen接口。 为什么WinRT的MIDL不再允许这种情况,这是COM体系结构的基础,创建了接口层次结构

谢谢你的意见
O.Rouit

所有Windows运行时界面必须直接从
IInspectable
派生。不可能通过从另一个Windows运行时接口派生间接派生

您可以使用requires关系,使用
requires
,而不是使用派生自关系:

[uuid(863571FC-4CBB-47E8-8BD3-2709D5CB7D0D)]
[version(COMPONENT_VERSION)]
interface ICitizen : IInspectable
    requires IPerson 
{
    [propget] HRESULT Address([out, retval] IAddress** value);
    [propput] HRESULT Address([in] IAddress* value);
}

这需要关系指定实现
ICitizen
接口的任何类型也必须实现
IPerson
接口。不过,这些接口是独立的,并且具有不同的(非共享)vtables。requires关系为1:M,因此单个接口可能要求任何实现者也实现一组M个其他接口。

所有Windows运行时接口必须直接从
IInspectable
派生。不可能通过从另一个Windows运行时接口派生间接派生

您可以使用requires关系,使用
requires
,而不是使用派生自关系:

[uuid(863571FC-4CBB-47E8-8BD3-2709D5CB7D0D)]
[version(COMPONENT_VERSION)]
interface ICitizen : IInspectable
    requires IPerson 
{
    [propget] HRESULT Address([out, retval] IAddress** value);
    [propput] HRESULT Address([in] IAddress* value);
}

这需要关系指定实现
ICitizen
接口的任何类型也必须实现
IPerson
接口。不过,这些接口是独立的,并且具有不同的(非共享)vtables。requires关系为1:M,因此单个接口可能要求任何实现者也实现一组M个其他接口。

Btw,我建议您定义方法以获取运行时类,而不是接口。另外,不要忘记运行MIDL通过mdmerge工具生成的.winmd文件——如果不这样做,它将无法被C++/CX、C#或JS使用。@LarryOsterman善意地解释了为什么更好地定义使用运行时类而不是接口的方法?ABI层的IIRC、COM只处理w/接口(提供runtimeclass参数相当于提供_INonVirtualPublic i/f作为参数)。顺便说一句,我建议您定义方法来获取运行时类,而不是接口。另外,不要忘记运行MIDL通过mdmerge工具生成的.winmd文件——如果不这样做,它将无法被C++/CX、C#或JS使用。@LarryOsterman善意地解释了为什么更好地定义使用运行时类而不是接口的方法?ABI层的IIRC、COM仅处理w/接口(提供runtimeclass参数相当于提供_INonVirtualPublic i/f作为参数)