2015-09-19 67 views
2

我有一個Windows運行時組件在我所有的類需要公開內部手柄:公共引用類在C++/CX實施內部接口

private interface class IHandleContainer { 
    IntPtr GetHandle(); 
} 
namespace Foo { 
    public ref class Bar: IHandleContainer { ... } 
    public ref class Baz: IHandleContainer { 
    internal: 
     virtual IntPtr GetHandle() = IHandleContainer::GetHandle; 
    } 
} 

我不需要IHandleContainer是公開的,但是I do需要將IHandleContainer放在接口列表上,這樣我的每個內部對象才能成功地成爲safe_cast<IHandleContainer>

在命名空間之外,IHandleContainer不應該發射到元數據,但應該有一個與其關聯的COM GUID,並且通過將它列在ref類的接口列表中,CX應該能夠將正確的響應連接到QueryInterface 。在結構上,一切都應該「正常工作」。但是,編譯器不配合:

回答

3

不幸的是使用C++/CX,沒有你可以嘗試將工作的招數,這是不可能的。

  • 接口成員不能internal
  • 有沒有這樣的事情internal繼承
  • public WinRT的類型不能從private基地獲得
  • WinRT的類型不能從非WinRT的派生類型
  • public WinRT類型不能爲un sealed,除非它們來源於un sealed

這最後一個是遞歸的,而且出的是從現有的聯合國sealed提供平臺式推導像DependencyObject的唯一途徑,但你真的不想這樣做。

您需要在WRL或Kenny Kerr的純C++示例on MSDN Magazine中使用CloakedIid。無論哪種方式,你必須在IDL中定義你的類型,並以「硬」的方式實現它們。