2015-09-19 4 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 не должно быть выбрано в метаданных, но должно иметь ассоциированный с ним идентификатор GUID и, указав его в списке интерфейсов класса ref, CX должен иметь возможность подключить правильный ответ к QueryInterface , Структурно все должно «просто работать». Но компилятор не сотрудничает:

ответ

3

К сожалению, это не возможно с помощью C++/CX, и ни один из трюков, которые могли бы попробовать работать.

  • члены интерфейса не могут быть internal
  • Там нет такого понятия, как internal наследования
  • типы
  • public WinRT не может извлечь из private оснований
  • типа
  • WinRT не может вывести из неживого WinRT типы
  • public Типы WinRT не могут быть un sealed, если они не получены от чего-то, что не является sealed

Это последнее является рекурсивным, и единственный выход из него является вывод из существующего ООН sealed платформы при условии, типа как DependencyObject, но вы действительно не хотят, чтобы сделать это.

Вам необходимо использовать что-то CloakedIid в WRL или в чистом примере C++ Kenny Kerr on MSDN Magazine. В любом случае вам нужно определить свои типы в IDL и реализовать их «жесткий» способ.