Public ref class 在 C++/CX 中实现内部接口

Public ref class implementing internal interface in C++/CX

我有一个 Windows 运行时组件,我的所有 classes 都需要在内部公开句柄:

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 是 public,但我 需要 IHandleContainer 在接口列表上,这样我的每个内部对象都可以是 safe_cast<IHandleContainer>成功。

在命名空间之外,IHandleContainer 不应发送到元数据,但应该有一个与之关联的 COM GUID,并将其列在 ref class 的接口列表中,CX应该能够将正确的响应连接到 QueryInterface。从结构上讲,一切都应该 "just work." 但编译器不合作:

error C3991: 'Foo::Baz': cannot implement a non-public or nested interface 'IHandleContainer'

遗憾的是,使用 C++/CX 无法做到这一点,none 您可以尝试的技巧会奏效。

  • 接口成员不能是internal
  • 不存在internal继承
  • public WinRT 类型无法从 private 基础派生
  • WinRT 类型无法从非 WinRT 类型派生
  • public WinRT 类型不能是 unsealed 除非它们派生自 unsealed

最后一个是递归的,唯一的出路是从现有的非sealed平台提供的类型派生,比如DependencyObject,但你真的不想那样做。

您需要使用一些东西 CloakedIid in WRL, or Kenny Kerr's pure C++ example on MSDN Magazine。无论哪种方式,您都必须在 IDL 中定义类型并以 "hard" 方式实现它们。