gpt4 book ai didi

c++ - 如何激活 ref 类的实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:18 28 4
gpt4 key购买 nike

假设我有这个类:

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”)时,上面的代码确实有效,而不是我自己的引用类“App1.Page1”。


或者,鉴于我已经在 App1 命名空间中声明了一个名为 Page1 的公共(public)引用类,我如何才能将此类的实例激活为 IInspectable * 来自 HSTRING“App1.Page1”?

最佳答案

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

细节决定成败。 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 接口(interface)。在幕后,Windows 运行时不使用 .NET,因此它没有任何类型的“真实”反射,因此它依赖于静态定义的类型定义。

关于c++ - 如何激活 ref 类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36057754/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com