我的编程空间,编程开发者的网络收藏夹
学习永远不晚

COM技术入门(3)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

COM技术入门(3)

(1)COM组件注册卸载与智能指针


一COM组件注册和卸载

1.Regsvr32.exe命令是用来对"Active控件"进行注册的

命令格式

注册 Regsvr32 路径/名称.dll  

卸载  Regsvr32 /u 路径/名称.dll

2.ATL制作出的简单对象是".dll"形式

Visual Stduio在编译成这个dll时,对它自动进行了注册.


blob.png

比如我注册一个

blob.png

就成功注册啦, 卸载只要在前面加个 /u就行

blob.png

如果你卸载了程序就用不了这个组件了,因为注册表找不到相关信息.



3.注册好后查看.打开注册表 reg就是注册检测 Edit就是编辑

RegEdit即可打开注册表



4.在HKEY_CALSSES_ROOT\CLSID\搜索组件的clsid

blob.png


InprocServer32 放了DLL文件所在地址

blob.png


ProgID 简称 COM组件的PropID

表示组件

blob.png


5.COM组件注册意义

注册表信息中记录了组件的CLSID,组件的路劲,组件的PropID等

COM组件是跨应用的,网页,MFC,c# VB这些需要识别并创建我们的组件,最终

得到组件路劲,而路劲是可能改变的,比如用户安装程序时选择不同目录,CLSID

跟PropID是不变的,我们采用CLSID或PropID去创建组件,不管COM组件的DLL在哪个位置

 从vista开始,注册需要权限,




二、智能指针

1.简介

c++在调用COM接口指针是很危险的,因为程序每一处使用都

严格并且正确的调用AddRef()与Release()方法,一旦出现问题,就会造成

对象不能被释放,或者对象被重复删除

所以C++程序员使用COM接口时,得小心翼翼的,

改变这种现状的方法: 让变成更简单

使用智能指针即可.


2.CComPtr是智能指针,是ATL提供的一个模板类

能封装COM接口的AddRef()与Release()方法

CComPtr声明出的变量,是一个对象,这个对象封装了COM

接口指针,这个对象的使用访问跟COM接口的使用几乎一样.



3.智能指针与使用

	HRESULT hr = E_FAIL;
	hr = CoInitialize(NULL);
	if(SUCCEEDED(hr))
	{
		//智能指针
		CComPtr<IHelloSimpleObject>spHello;
		//创建实例 指定的类标识符创建一个Com对象
		//COM类其实就是组件,COM类标识 就是组件标识
		hr = spHello.CoCreateInstance(CLSID_HelloSimpleObject);
		//如果不使用智能指针则要这样
		//hr = CoCreateInstance(CLSID_HelloSimpleObject,NULL,CLSCTX_INPROC_SERVER,
		//	IID_IHelloSimpleObject,(LPVOID*)&pHello);

		if(SUCCEEDED(hr))
		{
			//接口的方法测试
			LONG sum = 0;
			hr = spHello->SumLong(100,100,&sum);

			//读取描述
			BSTR bstrs = SysAllocString(L"");
			hr = spHello->get_m_desc(&bstrs);
			SysAllocString(bstrs);
			bstrs = NULL;

			//写入
			BSTR strb = SysAllocString(L"MFC中测试");
			hr = spHello->put_m_desc(strb);
			SysAllocString(strb);
			bstrs = NULL;

			bstrs = SysAllocString(L"");
			hr = spHello->get_m_desc(&bstrs);
			SysAllocString(bstrs);
			bstrs = NULL;
		}
		//这里则可以省略 不用调用
		//spHello->Release();
	}

	CoUninitialize();



4.智能指针的使用方式与COM接口指针方法相似,也有区别

智能指针创建对象时,内部有一个智能指针.其实他是一个类对象

是一个模板的,

创建好后,这个对象对象内部有一个IHelloSimpleObjet,初始化NULL

IHelloSimpleObject* pIhello,  一个原始的COM接口指针。


5.这两个在CoCreateInstance中使用方法一模一样,因为对智能指针的&材质

会转变成对智能指针内部的 IHelloSimpleObjedt(其实是个模板变量)进行&操作


6.二者使用->操作用法意义一样,因为智能指针的->会转变成

_NoAddRefReleaseOnCComptr<IHelloSimpleObjectSub>*接口变量->操作

_NoAddRefReleaseOnCComptr<IHelloSimpleObjectSub>是IHelloSimpleObjectSub的子类


7.智能指针把AddRef()与Release()放在 private里,所以你不能手动调用。


8.对COM接口指针的赋值是需要AddRef操作,智能指针则不需要,他会智能的执行.

Release也是智能的,不需要我们去管理了.


9.智能指正的变量是一个对象

如果是局部变量,将这个局部变量声明器结束时,执行智能指针西沟

如果是成员变量,在成员所在类对象析构时,执行智能指针的析构

如果是静态变量.将在程序结束时,执行智能指针的析构


三、智能指针注意点

1如果要使用一个智能指针,直接给它赋值NULL,这样内部COM接口指针

也会执行Release操作,来减少引用计数.


2.当对指取地址时(&)要确保智能指针为NULL,因为他返回的是内部的

COM接口指针,如果不为NULL则旧的COM接口指针,将没有执行Release而

赋值了一个新的COM指针接口.


3.不过可以放心,因为这时候,智能指针不为NULL,智能指针

代码通过assert报错,







免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

COM技术入门(3)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

COM技术入门(3)

(1)COM组件注册卸载与智能指针一COM组件注册和卸载1.Regsvr32.exe命令是用来对"Active控件"进行注册的命令格式注册 Regsvr32 路径/名称.dll  卸载  Regsvr32 /u 路径/名称.dll2.ATL
2023-01-31

Java技术:Java科技计算入门

Java技术:Java科技计算入门: Detail:Java技术:Java科技计算入门[@more@]
2023-06-03

Makefile入门(3)

版权所有,转载请注明:本文出自学与思linux编程网接着Makefile入门(2)继续来学习Makefile在前面的例子中,Makefile中的每个目标体都是一个文件,但事实上我们在看别人写得比较正规的Makefile时,我们会发现有些目标
2023-01-31

达梦7入门技术总结-

说明:1)该实验所有过程均是本人亲自敲命令完成,所有代码运行正确2)安装过程使用的是suse11 sp3操作系统,后续的实验过程换成了麒麟中标,因此部分路径可能存在差异3)安装过程使用了命令行安装,图形界面简单,因此本文没有介绍4)job部分命令行操作太繁琐,
2017-08-27

路由器技术深入剖解(3)

路由器工作原理1、基本原理要实 现 网 络中通信节点彼此之间的通信,首先必须给每个节点分配一个唯一的IP地址。路由器应该至少有两个网络端口,分别连接LAN或者WAN子网上,每个端口必须具有一个唯一的IP地址,并且要求与所连接IP子网的网络号
2023-01-31

Android入门(3)Progress

一、提要        今天要学习的是两个稍微复杂一些的控件。       ProgressBar经常用于文件载入,处理文件,下载等场合。       ListView用于以列表的形式展示内容。      最终效果:       二、L
2023-01-31

Redis_技术_超详细入门教程

Redis_技术_超详细入门教程 一. NoSQL概述 1.在说Redis之前,让我们先去了解NoSQL,为什么呢? 因为,主流NoSQL的产品中,就包含了我们即将学习的Redis     2. 什么是NoSQL NoSQL(NoSQL = Not On
Redis_技术_超详细入门教程
2015-10-17

linux入门教程(3)

(文:flynng)  3.4 进程管理  Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。  在Linux系统
2023-01-31

Django 入门学习(3)

在例4的基础上,我希望直接保存数据到数据库中。 Django自带了一个sqlite的数据库,已经配置好了 可以直接使用。使用方式和sqlalchemy类似,相当于一个内置的ORM框架。settings.py 默认已经绑定了sqlite3DA
2023-01-31

ARM入门笔记(3)

第三章 点亮我的LED ――I/O输出实验 一.背景 当完成上述实验后,我就可以像使用51单片机那样,在C文件的main()函数中通过设置相应的寄存器来达到对相应外设(如I/O的输入、输出等)的控制目的。 二.实验目的 通过控制PIO的相关
2023-01-31

Linux入门笔记3

一、管理权限和归属1.权限概述文档归属所有者(u):拥有此文件/目录的用户-user所属组(g):拥有此文件/目录的组-group其他用户(o):除所有者、所属组以外的用户-other访问权限读取(r):允许查看内容-read写入(w):允
2023-01-31

mysql轻快入门(3)

有一种情况,你忘记数据库密码啦,你怎么办,砸电脑吗?no.....请见下:select host,user,password from mysql.user;update mysql.user set password=password('
2023-01-31

云服务器入门须知的3个技巧

根据您的使用习惯和选择的云计算平台,您可能会发现,与使用服务器租用、云虚拟主机、VPS等业务承载方式不同,您仍然需要去熟悉全新的计算、存储、网络连接等多种组合。在设置云服务器搭载环境时,56云为您提供3个云服务器入门须知的技巧。  一、设置
2023-06-03

×××技术详解(3)

九、数据传输阶段  一旦完成上述4阶段的协商,PPP就开始在连接对等双方之间转发数据。每个被传送的数据报都被封装在PPP包头内,该包头将会在到达接收方之后被去除。如果在阶段1选择使用数据压缩并且在阶段4完成了协商,数据将会在被传送之间进行压
2023-01-31

物联网连接技术入门指南

从通过智能监控改善业务流程,设计先进的互联设备系统,到实现应用程序设计,物联网已经进入了几乎所有的业务和技术领域。

谈谈关于存储技术的入门

哈哈,没错,我们现在处于信息时代,每天都在和电脑、手机打交道。我们的工作和生活,已经完全离不开视频、音乐、图片、文本、表格这样的数据文件。

Python3快速入门——(3)dict

#先回忆下列表的操作animals=["cat","dog","rabbit"] #找到list中的某个值(第一种方法)for animal in animals: if(animal=="cat"):
2023-01-31

Python入门3-变量2

1.字典(使用花括号定义)   dairy_section = {}   dairy_section["breakfast"] = ("break","milk")   dairy_section["lunch"] = ("noodles"
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录