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);
}

この MIDL を WinRT 用にコンパイルしようとすると、次のエラーが発生します。

エラーMIDL5004 : インターフェイスは IInspectable から継承する必要があります: ICitizen

WinRT の下で COM がどうなったのか、私は本当に困惑しています。インターフェイスを別のインターフェイスから継承するような単純なことがもはや不可能な場合、どうすればそれを使用してアプリケーションを設計できますか?

WinRT の MIDL のドキュメントを検索しましたが、見つかりませんでした!! Google でエラー MIDL5004 を検索しても、結果が表示されません。

Microsoft の誰かが、IInspectable から継承する別のインターフェイスを継承するインターフェイスを作成する方法を説明できますか。別のテストでは、C++/CX で同じインターフェイスを作成し、IPerson から継承する ICitizen インターフェイスを作成できました。WinRT の MIDL でこれが許可されなくなった理由は、これが COM アーキテクチャの基盤であり、インターフェイスの階層を作成するためです。

ご意見ありがとうございます O. Rouit

4

1 に答える 1

4

すべての Windows ランタイム インターフェイスは、 から直接派生する必要がありますIInspectable。別の Windows ランタイム インターフェイスから派生することによる間接的な派生はできません。

派生元関係を使用する代わりに、以下を使用して、require 関係を使用できます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 を持っています。必要な関係は 1:M であるため、単一のインターフェイスは、実装者が M 個の他のインターフェイスのセットも実装することを要求する場合があります。

于 2013-01-06T07:44:25.980 に答える