如何激活ref类的实例

时间:2016-03-17 10:26:34

标签: c++ windows-runtime c++-cx wrl

说我有这个班:

public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};

我可以像这样激活这个类的实例:

auto page = ref new Page1();

但是我如何在原始C ++中做到这一点?

我试过这个,但它不起作用:

Microsoft::WRL::Wrappers::HString className;
className.Set(L"App1.Page1");
IInspectable *page;
Windows::Foundation::ActivateInstance(className.Get(), &page);

当我指定一个Windows运行时类名(例如“Windows.UI.Xaml.Controls.Button”)时,上面的代码确实有效,而不是我自己的ref class“App1.Page1”。

或者,鉴于我已在Page1命名空间中声明了名为App1的公共引用类,如何从HSTRING“App1”激活此类的实例为IInspectable* .Page1" ?

1 个答案:

答案 0 :(得分:0)

我想我已经弄明白了。好吧,这个答案并没有直接解决激活任何类型的问题,但它做了我想做的事。

魔鬼在细节中。 XAML编译器将生成一组在解决方案资源管理器中不可见的文件。这些文件的扩展名为.g.h.g.hpp。您可以单击"显示所有文件"解决方案资源管理器中的按钮可以看到它们。

App.g.h中,App类实现了Windows::UI::Xaml::Markup::IXamlMetadataProvider类,我们可以使用它来获取有关XAML类型的信息。 XamlTypeInfo文件包含生成的类型定义。

以下是一些代码,展示了如何从TypeName激活我们的某个XAML类型:

Object^ activate(TypeName typeName)
{
    auto app = Application::Current;
    auto provider = static_cast<IXamlMetadataProvider^>(app);
    auto xamlType = provider->GetXamlType(typeName);
    return xamlType->ActivateInstance();
}

由于XAML编译器生成的XAML类型信息,因此无需WRL,100%C ++ / CX!

我相信C#项目也有类似的结构,因为Application派生类也会实现IXamlMetadataProvider接口。在Windows引擎盖下,Windows运行时不使用.NET,因此它没有任何类型的&#34;真正的&#34;反射,所以它依赖于静态定义的类型定义。