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" 方式实现它们。
我有一个 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" 方式实现它们。