1.com 组件对象模型

com是微软组件对象模型的简称。由于com具有二进制代码共享的
特性,所以它具备了高可开发性,高度可维护性和高度的可移植性(跨开发语言),以至于在windows上面的诸多应用软件采用了com来做整体的架构。比如微软的DirectX等。com虽然流行于2000-2004年之间,由于它的普及面之广,应用软件种类之繁多再加上windows对其默认支持很好,开发出来的软件无需依赖其他的开发包,所以被很多软件公司采用至今

2.com组件的优点

  • 采用com组件架构我们的软件,会使我们更方便地进行模块划分,而且各模块独立性高,耦合度低,从而更方便地进行开发任务的分工。(开发性)

  • 采用com组件架构我们的软件,会使我们更方便地维护,升级软件,因为我们可以很方便地直接用新模块替换旧模块,而不影响软件的其他功能(维护性)

  • 采用com组件架构我们的软件,可以使我们已编写好的功能模块可以很方便地移植到其他平台,如从c++的MFC平台移植到C#的WinForm平台.因为COM组件是跨应用的,可以被C++调用也可以被C#调用(移植性)

3.内存资源何时释放

在主函数的最后面执行delete pA确实是一个可行的办法,但却不是好办法,因为这样子最终是释放了pA的内存资源,
不过却不是"及时"(在pA所指的组件不用时)地释放内存资源,如果一个程序,所有的资源在不用时都没有及时释放,这个程序在运行中所占用的内存将是巨大的,如何解决这个问题呢?这就需要引用计数技术

4.引用计数的原理

引用计数计数就是用来管理对象生命期的一种计数
对象O可能同时被外界A,外界B,外界C引用。也就是说外界A,外界B,外界C可能都在使用对象O。
每次当对象被外界引用时,计数器就自增1
每次当对象不用对象时,计数器就自减1

在计数值为零时,对象本身执行delete this,销毁自己的资源,
引用计数使得对象通过计数能够知道何时对象不再被使用,然后及时地删除自身所占的内存资源

IUnknown接口的AddRef与Release就是引用计数的实现方法

5.AddRef与Release的实现与使用

AddRef,使组件的引用计数自增1
在返回之前调用AddRef,比如组件的构造函数,QueryInterface函数
在赋值之后调用AddRef,比如pIX3=pIX2,这时需要pIX3->AddRef()

Release,使组件引用计数自减1,如果引用计数为零,
释放本身的内存资源
在接口使用完之后,调用Release
查看Section2Demo1,关于AddRef与Release的使用,
并适当注释一些AddRef或Release查看CA的析构函数是否运行或会不会出现对无效指针(野指针)的操作

6.引用计数的优化

常用的com数据类型
INT
INT *
UINT *
LONG
LONG *
ULONG
ULONG *
FLOAT
FLOAT *
DOUBLE
DOUBLE *
VARIANT_BOOL
VARIANT_BOOL *

7.COM组件的注册

我们目前用ATL制作出来的简单对象是*.dll的形式
我们在上一讲中能调用这个dll,是因为我们的Visual
Studio在编译生成这个dll时,对它进行了注册

com组件的注册
手动注册
cmd命令黑窗
regsvr32 路径…dll

提示注册成功
…中的DllRegisterServer成功

com组件被注册后,注册信息在哪里?
打开注册表编辑器
用cmd黑窗打开regedit(注册表)
打开计算机\HKEY_CLASSES_ROOT\CLSID
搜素我们组件的clsid,比如我这边是F652…

我们从PropID项中,看到了我们com组件的PropID
PropID是指程序员给某个CLSID指定一个程序员易记
的名称,某些计算机语言是通过PropID来标识组件,
PropID的命名规则:
..

注册表的项

8.智能指针的简介

c++在调用com接口指针时是很危险的,因为使用过程
需要每一个使用都严格并且正确地调用AddRef()与Release()方法,一旦出现问题,就会造成对象不能被正常释放或者对象被重复删除

所以c++程序员使用com接口时,得小心翼翼的,用智能指针

Windows核心技术--com组件实用入门教程相关推荐

  1. JsRender实用入门教程

    这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下 本文是一篇JsRender的实 ...

  2. 视频教程-Lifecycle组件快速入门教程-Android

    Lifecycle组件快速入门教程 Android研发工程师.南京邮电大学毕业,曾就任于创新工场,现就任于某知名大型移动互联网公司,CSDN博客讲师.<libGDX移动游戏开发从入门到精通> ...

  3. windows下Graphviz安装及入门教程

    下载安装配置环境变量 intall 配置环境变量 验证 基本绘图入门 graph digraph 一个复杂的例子 和python交互 发现好的工具,如同发现新大陆.有时,我们会好奇,论文中.各种专业的 ...

  4. windows 下 Graphviz 安装及入门教程以及 PlantUML

    From:http://m.blog.csdn.net/lanchunhui/article/details/49472949 开源工具---使用简单的文字描述画UML图之PlantUML官网:htt ...

  5. 如何在windows下安装Python(Python入门教程)

    第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载,请注意,当你的电脑是32位的机器,请选择32位的安装包,如果是64 ...

  6. 新手必看!如何在windows下安装Python(Python入门教程)

    第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载,请注意,当你的电脑是32位的机器,请选择32位的安装包,如果是64 ...

  7. 【译】MochiWeb(基于Erlang的高性能WEB服务器)实用入门教程

    原文出处:http://alexmarandon.com/articles/mochiweb_tutorial/ 翻译出处:http://www.cnblogs.com/ken-zhang/archi ...

  8. LDAP在windows下配置及安装入门教程

    LDAP快速入门 1. LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的 ...

  9. lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度

    OLED模块介绍 OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被 ...

  10. Kubernetes 高性能网络组件 Calico 入门教程

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 1.Calico概述 Calico 是 Kubernetes 生态系统中另一种流行的网络选择.虽然 Flannel ...

最新文章

  1. 自定义GridView分页模板
  2. maven 强制更新_Android App内部更新Library的方法
  3. sepFilter2D函数
  4. 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机体系结构/并行与分布计算/存储系统
  5. 创业,宁愿单兵作战也不要参在拙劣的团队里继续寻觅队友
  6. 作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
  7. 论文学习14-End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures(端到端实体关系抽取)
  8. java线程池 core_Java 线程池 ThreadPoolExecutor 的使用
  9. mysql判断范围0到10 11到20_SQL 如何查询日期在一定范围内的数据
  10. JavaScript中的.trim()无法在IE中运行
  11. Cent OS 6.X 开机错误修复
  12. 《数据库系统原理》课程设计:超市订单管理系统
  13. 解决QQ或TIM下载群文件网路失败或者网速贼慢的办法
  14. 卡诺模型案例分析_通过KANO模型来协调优先级排序(附实例)
  15. 【贪玩巴斯】一文通过操作实例——学会 知网专业检索 2022年3月21日
  16. VBA WORD 段落前加空行
  17. 基于正交投影的实时三维人体姿态估计
  18. Swift3豆瓣电台
  19. 为什么计算机的网络id,网络ID、主机ID和子网掩码
  20. TL-1到底是什么?

热门文章

  1. 土地利用转移矩阵图怎么做_土地利用转移矩阵怎么分析excel?
  2. 计算机系大学生为什么选择在CSDN写博客?
  3. esp-idf的内存管理——内存管理组件的初始化
  4. 软件配置管理计划示例
  5. 从零开始学编程——DOS命令
  6. ubuntu 20.04安装谷歌拼音输入法
  7. centos 安装rarlinux
  8. 启动gis管理器显示无法启动服务器,mapgis狗不能启动,提示是服务器启动失败,是怎么回事?...
  9. StarUML 3 中文文档 构件图
  10. Android mc怎么和win10联机,大更新!我的世界手机版/win10版联机完美互通