【问题标题】:Public ref class implementing internal interface in C++/CX在 C++/CX 中实现内部接口的公共 ref 类
【发布时间】:2015-12-16 21:38:50
【问题描述】:

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

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,但我确实需要 IHandleContainer 出现在接口列表中,这样我的每个内部对象都可以成功safe_cast<IHandleContainer>

在命名空间之外,IHandleContainer 不应该被发送到元数据,但应该有一个与之关联的 COM GUID,并且通过在 ref 类的接口列表中列出它,CX 应该能够连接正确的响应查询接口。从结构上讲,一切都应该“正常工作”。但是编译器不配合:

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

【问题讨论】:

    标签: windows-runtime c++-cx winrt-component


    【解决方案1】:

    不幸的是,这在使用 C++/CX 时是不可能的,而且你可能尝试的任何技巧都不会奏效。

    • 接口成员不能是internal
    • 没有internal继承之类的东西
    • public WinRT 类型不能从 private 基派生
    • WinRT 类型不能派生自非 WinRT 类型
    • public WinRT 类型不能是 unsealed,除非它们派生自 unsealed

    最后一个是递归的,唯一的出路是从现有的 unsealed 平台提供的类型(如DependencyObject)派生,但您真的不想这样做这样做。

    您需要在 WRL 中使用 CloakedIid 或 Kenny Kerr 的纯 C++ 示例 on MSDN Magazine。无论哪种方式,您都必须在 IDL 中定义您的类型并以“硬”方式实现它们。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 2013-11-29
      • 2018-08-21
      • 2013-02-02
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多