2

我有一个 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 应该能够将正确的响应连接到 QueryInterface。从结构上讲,一切都应该“正常工作”。但是编译器不合作:

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

1 回答 1

3

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

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

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

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

于 2015-09-21T02:12:42.337 回答