首页 > 系统相关 >windows C++-通过 C++/WinRT 使用 API(三)

windows C++-通过 C++/WinRT 使用 API(三)

时间:2024-08-04 19:58:59浏览次数:16  
标签:windows auto factory C++ Windows MainPage API winrt 具现

统一构造

在 C++/WinRT 版本 2.0 及更高版本中,有一种优化的构造形式可供你使用,它被称作“统一构造”(请参见 C++/WinRT 2.0 中的新增功能和更改)。

若要使用统一构造而不是 winrt::make,你需要一个激活工厂。 要生成激活工厂,一种好的方式是向 IDL 添加构造函数。

// MainPage.idl
import "BookstoreViewModel.idl";
namespace Bookstore
{
    runtimeclass MainPage : Windows.UI.Xaml.Controls.Page
    {
        MainPage();
        BookstoreViewModel MainViewModel{ get; };
    }
}

 然后,在 MainPage.h 中声明和初始化 m_mainViewModel;此操作只需一步,如下所示。

// MainPage.h
...
struct MainPage : MainPageT<MainPage>
{
    ...
    private:
        Bookstore::BookstoreViewModel m_mainViewModel;
        ...
    };
}
...

接下来,在 MainPage.cpp 中的 MainPage 构造函数中,无需使用代码 m_mainViewModel = winrt::make<Bookstore::implementation::BookstoreViewModel>();。

实例化和返回具现类型和接口

以下具现类型和实例的示例可能类似于使用的项目。 请记住,具现类型(如此示例中的一种具现类型)是工具生成的,而不是你自己创作的内容。

struct MyRuntimeClass : MyProject::IMyRuntimeClass, impl::require<MyRuntimeClass,
    Windows::Foundation::IStringable, Windows::Foundation::IClosable>

// MyRuntimeClass 是具现类型;具现接口包括 IMyRuntimeClass 、IStringable 和 IClosable 。 
// 本主题已展示你可用来实例化具现类型的不同方法。 
// 以下是提醒和总结,这里使用 MyRuntimeClass 作为示例。

// The runtime class is implemented in another compilation unit (it's either a Windows API,
// or it's implemented in a second- or third-party component).
MyProject::MyRuntimeClass myrc1;

// The runtime class is implemented in the same compilation unit.
MyProject::MyRuntimeClass myrc2{ nullptr };
myrc2 = winrt::make<MyProject::implementation::MyRuntimeClass>();

// 你可以访问一个具现类型的所有接口的成员。
// 可以将具现类型返回到调用方。
// 具现类型和接口派生自 winrt::Windows::Foundation::IUnknown 。 
// 因此,你可以对具现类型或接口调用 IUnknown::as 以查询其他也可使用或返回到调用方的具现接口。 
// as 成员函数的工作方式类似于 QueryInterface 。

void f(MyProject::MyRuntimeClass const& myrc)
{
    myrc.ToString();
    myrc.Close();
    IClosable iclosable = myrc.as<IClosable>();
    iclosable.Close();
}
激活工厂

创建 C++/WinRT 对象的便利直接的方式如下所示。

using namespace winrt::Windows::Globalization::NumberFormatting;
...
CurrencyFormatter currency{ L"USD" };

// 不过,有时你可能想要自己创建激活工厂,然后在方便时从其创建对象。 
// 下面的一些示例向你展示了如何使用 winrt::get_activation_factory 函数模板来实现此目的。

using namespace winrt::Windows::Globalization::NumberFormatting;
...
auto factory = winrt::get_activation_factory<CurrencyFormatter, ICurrencyFormatterFactory>();
CurrencyFormatter currency = factory.CreateCurrencyFormatterCode(L"USD");

// 
using namespace winrt::Windows::Foundation;
...
auto factory = winrt::get_activation_factory<Uri, IUriRuntimeClassFactory>();
Uri uri = factory.CreateUri(L"http://www.contoso.com");

// 上面两个示例中的类是来自 Windows 命名空间的类型。 
// 在接下来的示例中,ThermometerWRC::Thermometer 是在 Windows 运行时组件中实现的自定义类型。

auto factory = winrt::get_activation_factory<ThermometerWRC::Thermometer>();
ThermometerWRC::Thermometer thermometer = factory.ActivateInstance<ThermometerWRC::Thermometer>();
成员/类型多义性

当成员函数的名称与类型的名称相同时,会产生多义性。 根据 C++ 的在成员函数中进行非限定名称查找的规则,必须先搜索类,然后才能在命名空间中进行搜索。 “替换失败不是错误 (SFINAE)”规则不适用(在对函数模板进行重载解析时适用)。 因此,如果类中的名称没有意义,则编译器不会继续查找更好的匹配,它会直接报告一个错误。

struct MyPage : Page
{
    void DoWork()
    {
        // This doesn't compile. You get the error
        // "'winrt::Windows::Foundation::IUnknown::as':
        // no matching overloaded function found".
        auto style{ Application::Current().Resources().
            Lookup(L"MyStyle").as<Style>() };
    }
}

在上面的代码中,编译器认为你是在将 FrameworkElement.Style()(这在 C++/WinRT 中是成员函数)作为模板参数传递给 IUnknown::as。 解决方案是将名称 Style 强制解释为类型 Windows::UI::Xaml::Style。

struct MyPage : Page
{
    void DoWork()
    {
        // One option is to fully-qualify it.
        auto style{ Application::Current().Resources().
            Lookup(L"MyStyle").as<Windows::UI::Xaml::Style>() };

        // Another is to force it to be interpreted as a struct name.
        auto style{ Application::Current().Resources().
            Lookup(L"MyStyle").as<struct Style>() };

        // If you have "using namespace Windows::UI;", then this is sufficient.
        auto style{ Application::Current().Resources().
            Lookup(L"MyStyle").as<Xaml::Style>() };

        // Or you can force it to be resolved in the global namespace (into which
        // you imported the Windows::UI::Xaml namespace when you did
        // "using namespace Windows::UI::Xaml;".
        auto style = Application::Current().Resources().
            Lookup(L"MyStyle").as<::Style>();
    }
}

 非限定名称查找有一个特殊的例外,即名称后面跟有 ::,在这种情况下,它会忽略函数、变量和枚举值。 这样你就可以执行如下所示的代码。

struct MyPage : Page
{
    void DoSomething()
    {
        Visibility(Visibility::Collapsed); // No ambiguity here (special exception).
    }
}

对 Visibility() 的调用会解析为 UIElement.Visibility 成员函数名称。 但是参数 Visibility::Collapsed 在 Visibility 一词后面跟有 ::,因此系统会忽略方法名称,编译器会查找枚举类。

标签:windows,auto,factory,C++,Windows,MainPage,API,winrt,具现
From: https://blog.csdn.net/m0_72813396/article/details/140759511

相关文章

  • windows C++-通过 C++/WinRT 使用 API(二)
    延迟初始化在C++/WinRT中,每个类型都有一个特殊的C++/WinRTstd::nullptr_t构造函数。除了该构造函数,所有其他类型的构造函数(包括默认的构造函数)都会导致系统创建一个支持的Windows运行时对象,并为你提供它的智能指针。因此,该规则适用于使用默认构造函数的任何地方,例如......
  • 深入剖析:Apache Flink的Table API与SQL API之差异
    在当今的大数据处理领域,ApacheFlink以其卓越的流处理能力而广受关注。Flink提供了多种API来满足不同场景下的数据流处理需求,其中TableAPI和SQLAPI是两种非常关键的接口。本文将深入探讨这两种API的特点、使用场景以及它们之间的主要区别,并通过少量示例代码来展示它们的应......
  • C++3级
    虚拟星辰大家好,我是新人,这是我的第一个博客,6月29日的3级认证T1题目大致是这样的:小杨发明了一套密码系统,具体来说,他把字母的顺序向后移了N位。比如说,原来的字母顺序是:ABCDEFGHIJKLMNOPQRSTUVWXYZ当N为1时,字母顺序变为:BCDEFGHIJKLMNOPQRSTUVWXYZA当N为2时,字母顺序变为:CDEF......
  • C++入门
    目录命名空间IO流缺省参数函数重载为什么C语言不支持重载而C++支持重载?引用引用特性:常引用使用场景引用和指针的区别内联函数的定义以及注意auto关键字自动类型推断基于范围的for循环命名空间C语言中会有命名冲突,C++为了解决这个问题增加了namespace(命名空间)......
  • 如何处理“内部C++对象(某些对象)已删除”?
    当我关闭具有记录器的窗口然后重新打开该窗口时,我收到“RuntimeError:内部C++对象(PySide6.QtWidgets.QPlainTextEdit)已删除。”(我根据这篇文章制作了记录器:在pyqt中显示日志的最佳方式?)。当我从LoggerWindow的closeEvent中删除“self.deleteLater()”时,我没......
  • UEFI模式下Windows10重启主板喇叭报警
    UEFI模式下Windows10重启主板喇叭报警,并且无法进入bios。主板发生一件怪事,就是正常开机的情况下,开机正常进入系统,也可以进入bios,主板喇叭不会报错。但是进入到系统再手动重启的话,主板喇叭会报错,然后全程黑屏,无法进入bios,黑屏过后直接进入Windows,如果不纠结这个问题其实可以不用管......
  • 教你如何使用Windows电脑对IOS手机上的网页进行调试
    前期准备PC端安装Chrome浏览器。苹果手机一部。连接电脑数据线一条。梯子。PC端安装iTunes或者爱思助手。苹果手机设置打开“设置”→找到“Safari浏览器”点击进去→往下滑找到“高级”进行点击→打开“Web检查器”。电脑配置步骤安装scoop 搜索PowerShell并使用管理......
  • webpack HMR API解析
    介绍一下webpackhmr相关的APIwebpack首先将模块变成对象的一个属性,该属性是一个方法,调用它就返回最新的模块。模块的变更就变成了更新这些方法的定义。其次,webpack对于我们代码的import,做了拦截,会变成从它的模块对象里面去读取模块,同时它做了缓存。最后,当模块变化的时候,它会依......
  • C++ 返回值类型推导
    C++返回值类型推导前言C++中获取函数签名可以很简单地用decltype(函数名)来获得,但是这样无法直接提取出返回值类型。有时我们需要获取函数或可调用对象的返回值类型,以便进行后续的操作,在泛型编程中很常用,特别是当不同的参数集的结果类型不同时。头文件<type_traits>:C......
  • 买二手NVIDIA网卡被坑记录:某宝的咸鱼二手交易网站上购入NVIDIA Mellanox ConnectX-3
    原本是打算去大连的人工智能计算中心去做技术负责人的,不过考虑到工作性质再考虑到自己的一些现实情况也就放弃了这个职位(比较在大连理工大学的博士学位还没有读下来,还是有所牵挂的)。同时,由于自己已经退出了大连理工的相关实验室以及华为集团和大连化物所的相关工作,因此我也就没有......