当前位置: 首页 > news >正文

windows C++-windows C++/CX简介(三)

 ^类型

 (^) 是 C++/CX 最突出的功能之一——当人们第一次看到 C++/CX 代码时,很难不注意到它。那么,^ 类型到底是什么?这是类型是一种智能指针类型,它自动管理 Windows 运行时对象的生命周期,也 提供自动类型转换功能以简化 Windows 运行时对象的使用。

我们将首先讨论如何通过 WRL 使用 Windows 运行时对象,然后解释 C++/CX 帽子如何工作以使事情变得更简单。

    public interface struct IGetValue{int GetValue() = 0;};public interface struct ISetValue{void SetValue(int value) = 0;};public ref class Number sealed : public IGetValue, ISetValue{public:Number() : _value(0) { }virtual int  GetValue()          { return _value;  }virtual void SetValue(int value) { _value = value; }private:int _value;};

在这个修改后的 Number 实现中,我们定义了一对接口,IGetValue 和 ISetValue,它们声明了 Number 的两个成员函数;然后 Number 实现了这两个接口。除此之外,一切看起来应该非常熟悉。

请注意,Number 实际上实现了三个 Windows 运行时接口:除了 IGetValue 和 ISetValue 之外,编译器仍会生成 Number 实现的 __INumberPublicNonVirtuals 接口。由于 Number 的所有成员都是由显式实现的接口(IGetValue 和 ISetValue)声明的,因此编译器生成的 __INumberPublicNonVirtuals 不会声明任何成员。但是,此接口仍然是必需的,因为它是 Number 类型的默认接口。每个运行时类型都必须有一个默认接口,并且默认接口几乎始终对类是唯一的。稍后我们将看到默认接口为何如此重要。

生命周期管理

Windows 运行时引用类型使用引用计数进行对象生命周期管理。所有 Windows 运行时接口(包括 Number 实现的所有三个接口)都直接派生自 IInspectable 接口,而该接口本身又派生自 COM IUnknown 接口。IUnknown 声明了三个成员函数,用于控制对象的生命周期并允许类型转换。

MSDN对 IUnknown 生命周期管理的工作原理进行了全面概述。但原理非常简单:每当您创建对对象的新引用时,都必须调用 IUnknown::AddRef 来增加其引用计数;每当您“销毁”对对象的引用时,都必须调用 IUnknown::Release 来减少引用计数。引用计数初始化为零,在对 AddRef 和 Release 进行一系列调用后,当引用计数再次达到零时,对象将自行销毁。

当然,在使用 C++ 编程时,我们很少(实际上从不)直接调用 AddRef 和 Release。相反,我们应该尽可能地使用智能指针,在需要时自动进行这些调用。使用智能指针有助于确保对象不会因错过 Release 而泄漏,也不会因过早 Release 或 AddRef 失败而过早销毁。

ATL 包括 CComPtr 和一系列相关的智能指针,它们长期以来一直用于 COM 编程,用于自动管理实现 IUnknown 的对象的引用计数。WRL 包括 ComPtr,它是一种改进和现代化的 CComPtr(改进示例:ComPtr 不会像 CComPtr 那样重载一元 &)。

对于那些没有做过太多 COM 编程并且不熟悉 ComPtrs 的人:如果您使用过 shared_ptr(包含在 C++11、C++ TR1 和 Boost 中),ComPtr 在生命周期管理方面实际上具有相同的行为。机制不同(ComPtr 使用 IUnknown 提供的内部引用计数,而 shared_ptr 支持任意类型,因此必须使用外部引用计数),但生命周期管理行为相同。

C++/CX hat 具有与 ComPtr 完全相同的生命周期管理语义。复制 T^ 时,会调用 AddRef 来增加引用计数,而当 T^ 超出范围或被重新分配时,会调用 Release 来减少引用计数。我们可以考虑一个简单的示例来演示引用计数行为:

    {T^ t0 = ref new A();T^ t1 = ref new B();t0 = t1;t0 = nullptr;}

 首先,我们创建一个 A 对象并将其所有权赋予 t0。此 A 对象的引用计数为 1,因为有一个 T^ 引用了它。然后,我们创建一个 B 对象并将其所有权赋予 t1。此 B 对象的引用计数也是 1。

t0 = t1 的最终结果是 t0 和 t1 都指向同一个对象。这必须分三步完成。首先,调用 t1->AddRef() 来增加 B 对象的引用计数,因为 t1 正在获得该对象的所有权。其次,调用 t0->Release() 来释放 t0 对 A 对象的所有权。这会导致 A 对象的引用计数降至零,并且 A 对象会自行销毁。这会导致 B 对象的引用计数增加到 2。第三,也是最后,将 t1 设置为指向 B 对象。

然后,我们分配 t0 = nullptr。这会将 t0 “重置”为空,从而导致其释放对 B 对象的所有权。这会调用 t0->Release(),导致 B 对象的引用计数减少到 1。

最后,执行将到达块的结束括号:}。此时,所有局部变量都以相反的顺序被销毁。首先,t1 被销毁(智能指针,而不是指向的对象)。这会调用 t1->Release(),导致 B 对象的引用计数降至零,因此 B 对象会自行销毁。然后销毁 t0,这是一个无操作,因为它为空。

如果我们只关心生命周期管理,那么实际上根本不需要 ^:ComPtr<T> 足以管理对象生命周期。

类型转换

在 C++ 中,涉及类类型的某些类型转换是隐式的;其他类型转换可以使用强制转换或一系列强制转换来执行。例如,如果 Number 及其实现的接口是普通的 C++ 类型而不是 Windows 运行时类型,则从 Number* 到 IGetValue* 的转换将是隐式的,我们可以使用 static_cast 或 dynamic_cast 从 IGetValue* 转换为 Number*。

这些转换不适用于 Windows 运行时引用类型,因为引用类型的实现是不透明的,并且引用类型在内存中的布局未指定。在 C# 中实现的引用类型在内存中的布局可能与在 C++ 中实现的等效引用类型不同。因此,在直接使用 Windows 运行时类型时,我们不能依赖 C++ 语言特定的功能,例如隐式派生到基转换和强制转换。

要执行这些转换,我们必须改用 IUnknown 接口的第三个成员函数:IUnknown::QueryInterface。此成员函数可视为与语言无关的 dynamic_cast:它尝试执行到指定接口的转换并返回转换是否成功。由于每个运行时类型都实现 IUnknown 接口并为 QueryInterface 提供自己的定义,因此它可以执行任何必要的操作,以在实现它的语言和框架中获取正确的接口指针。

相关文章:

windows C++-windows C++/CX简介(三)

^类型 (^) 是 C/CX 最突出的功能之一——当人们第一次看到 C/CX 代码时&#xff0c;很难不注意到它。那么&#xff0c;^ 类型到底是什么&#xff1f;这是类型是一种智能指针类型&#xff0c;它自动管理 Windows 运行时对象的生命周期&#xff0c;也 提供自动类型转换功能以简化…...

《黑神话.悟空》:一场跨越神话与现实的深度探索

《黑神话.悟空》&#xff1a;一场跨越神话与现实的深度探索 在国产游戏日益崛起的今天&#xff0c;《黑神话.悟空》以其独特的剧情、丰富的人物设定和深刻的主题&#xff0c;成为了无数玩家翘首以盼的国产3A大作。这款游戏不仅是一次对传统故事的创新演绎&#xff0c;更是一场对…...

【Kotlin设计模式】建造者模式在Android中的应用

前言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;一步一步地构建一个复杂对象的不同部分&#xff0c;而不是直接创建该对象的实例。建造者模式的核心思想是将对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的…...

Kafka 性能为什么比 RocketMQ 好

Kafka 性能更好的原因 因为 kafka 零拷贝技术跟 RocketMQ 的不一样。 kafka 零拷贝技术使用的是 sendfileDMA scatter/gather 。只需要经过 2 次拷贝&#xff0c;2 次上下文切换RocketMQ 零拷贝使用的 mmap 内存映射&#xff0c;需要经过 3 次拷贝&#xff0c;4 次上下文切换…...

el-image的配套使用(表格,表单)

1. 配合table在一起使用&#xff0c;支持预览 此处使用场景是表格中只显示一张图片 preview-src-list只支持数组&#xff0c;故需要将单个字符串转换为转换为字符串数组 <el-table-column align"center" label"二维码"><template slot-scope&q…...

MKS MWH-5匹配器Automatc matching impedance Network手侧

MKS MWH-5匹配器Automatc matching impedance Network手侧...

打卡50天------图论

正式开启图论了&#xff0c;作为一个前端工程师&#xff0c;这个代码随想录真的刷新了我对于算法的认知&#xff0c;每天都在学习新东西。 别着急、放轻松、慢慢来。 一、图论理论基础 二、深搜理论基础 了解一下深搜的原理和过程&#xff0c;其实对于深搜和广搜我自己也写过…...

实现 FastCGI

CGI的由来&#xff1a; 最早的 Web 服务器只能简单地响应浏览器发来的 HTTP 请求&#xff0c;并将存储在服务器上的 HTML 文件返回给浏 览器&#xff0c;也就是静态 html 文件&#xff0c;但是后期随着网站功能增多网站开发也越来越复杂&#xff0c;以至于出现动态技 术&…...

0x01 GlassFish 任意文件读取漏洞复现

参考文章&#xff1a; 应用服务器glassfish任意文件读取漏洞 - SecPulse.COM | 安全脉搏 fofa 搜索使用该服务器的网站 网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 "glassfish"&…...

RLOC_ORIGIN

RLOC_ORIGIN属性为相对放置的对象提供绝对位置或LOC RTL设计中的宏&#xff08;RPM&#xff09;。有关定义RPM和使用 RLOC_ORIGIN属性&#xff0c;请参阅《Vivado Design Suite用户指南&#xff1a;使用约束》 &#xff08;UG903&#xff09;[参考文献19]。 RPM是通过使用H_set…...

【Python】成功解决 NameError: name ‘reload‘ is not defined

【Python】成功解决 NameError: name ‘reload’ is not defined 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校…...

Android.bp和Android.mk文件有的区别

文章目录 1. 构建系统2. 语法和格式3. 可维护性和扩展性4. 编译效率5. 未来趋势 在Android的构建系统中&#xff0c; Android.mk和 android.bp是用于定义如何编译项目文件的两种文件类型&#xff0c;它们有一些显著的区别。 1. 构建系统 Android.mk&#xff1a;使用于基于GN…...

思科设备静态路由实验

拓扑及需求 网络拓扑及 IP 编址如图所示&#xff1b;PC1 及 PC2 使用路由器模拟&#xff1b;在 R1、R2、R3 上配置静态路由&#xff0c;保证全网可达&#xff1b;在 R1、R3 上删掉上一步配置的静态路由&#xff0c;改用默认路由&#xff0c;仍然要求全网可达。 各设备具体配置…...

学习笔记第二十九天

IPC 进程间通信方式&#xff1a;共享内存 原理 共享内存是最高效的进程间通信方式之一&#xff0c;因为它允许两个或多个进程直接访问同一块物理内存区域。这种机制避免了数据在用户空间和内核空间之间的频繁拷贝&#xff0c;从而显著提高了数据传输的效率。 在Linux系统中&…...

Apache Paimon走在正确的道路上|一些使用体验和未来判断

Apache Paimon这个框架大家应该都不陌生了。 在实际工作中大家应该多多少少都用到&#xff0c;这个文章是一个简单的使用体会。不涉及湖框架的拉踩&#xff0c;我们的着眼点是解决实际问题。 我来结合自身体会跟大家说说Paimon这个框架和对未来的一些判断。大家可以参考&#x…...

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装&#xff0c;截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …...

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外&#xff0c;外科医生有时会对骨组织进行非常复杂的手术&#xff0c;其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤&#xff0c;并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前&#xff0c;需要…...

达梦表字段、字段类型,精度比对及更改字段SQL生成

达梦表字段、字段类型&#xff0c;精度比对及更改字段SQL生成&#xff1a; 依赖 <!-- 达梦 Connector --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.62</version>&l…...

2.pandas--读取文件夹中所有excel文件进行合并

文章目录 代码对应的本地文件文件夹目录三个文件夹中的内容test01.xlsxtest02.xlsxtest03.xlsx 三个文件合并后得到merge.xlsx文件文件内容 生成result.xlsx文件内容 代码 import glob import pandas as pddf_merge pd.DataFrame() # 创建一个空的DataFramefolder_path &qu…...

WPS Office两个严重漏洞曝光,已被武器化且在野利用

WPS Office作为一款用户基数超过2亿的广泛使用的办公套件&#xff0c;被发现存在两个关键漏洞&#xff08;CVE-2024-7262和CVE-2024-7263&#xff09;&#xff0c;这些漏洞可能导致用户遭受远程代码执行攻击。这两个漏洞的CVSS评分为9.3&#xff0c;表明它们的严重性很高&#…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...