0

我有以下非常简单的接口:

[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 没有显示任何结果!

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

感谢您的投入 O. Rouit

4

1 回答 1

4

所有 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接口。但是,这些接口是独立的,并且具有不同的(非共享)vtable。需求关系是 1:M,因此单个接口可能要求任何实现者也实现一组 M 个其他接口。

于 2013-01-06T07:44:25.980 回答