广告
返回顶部
首页 > 资讯 > 后端开发 > Python >COM技术入门(3)
  • 866
分享到

COM技术入门(3)

入门技术 2023-01-31 05:01:00 866人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

(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报错,







--结束END--

本文标题: COM技术入门(3)

本文链接: https://www.lsjlt.com/news/188272.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • COM技术入门(3)
    (1)COM组件注册卸载与智能指针一COM组件注册和卸载1.Regsvr32.exe命令是用来对"Active控件"进行注册的命令格式注册 Regsvr32 路径/名称.dll  卸载  Regsvr32 /u 路径/名称.dll2.ATL...
    99+
    2023-01-31
    入门 技术
  • SpringBoot技术快速入门
       目录 目录 Spring Boot是什么 Spring Boot 的特点 配置开发环境 创建 Spring Boot 项目 Maven 创建Spring Boot 项目 Spring Initializr 创建SpringBoot项目...
    99+
    2023-09-02
    spring boot java spring
  • Makefile入门(3)
    版权所有,转载请注明:本文出自学与思linux编程网 接着Makefile入门(2)继续来学习Makefile 在前面的例子中,Makefile中的每个目标体都是一个文件,但事实上我们在看别人写得比较正规的Makefile时,我们会发现有...
    99+
    2023-01-31
    入门 Makefile
  • Java技术:Java科技计算入门
    Java技术:Java科技计算入门: Detail:Java技术:Java科技计算入门[@more@]...
    99+
    2023-06-03
  • Android入门(3)Progress
    一、提要        今天要学习的是两个稍微复杂一些的控件。       ProgressBar经常用于文件载入,处理文件,下载等场合。       ListView用于以列表的形式展示内容。      最终效果:       二、L...
    99+
    2023-01-31
    入门 Android Progress
  • 达梦7入门技术总结-
    说明: 1)该实验所有过程均是本人亲自敲命令完成,所有代码运行正确 2)安装过程使用的是suse11 sp3操作系统,后续的实验过程换成了麒麟中标,因此部分路径可能存在差异 3)安装过程使用了命令行安装,图形界面简单,因此本文没有介绍 4)...
    99+
    2017-08-27
    达梦7入门技术总结-
  • 路由器技术深入剖解(3)
    路由器工作原理 1、基本原理 要实 现 网 络中通信节点彼此之间的通信,首先必须给每个节点分配一个唯一的IP地址。路由器应该至少有两个网络端口,分别连接LAN或者WAN子网上,每个端口必须具有一个唯一的IP地址,并且要求与所连接IP子网的网...
    99+
    2023-01-31
    路由器 技术
  • mysql轻快入门(3)
    有一种情况,你忘记数据库密码啦,你怎么办,砸电脑吗?no.....请见下:select host,user,password from mysql.user;update mysql.user set password=...
    99+
    2023-01-31
    轻快 入门 mysql
  • ARM入门笔记(3)
    第三章 点亮我的LED ――I/O输出实验 一.背景 当完成上述实验后,我就可以像使用51单片机那样,在C文件的main()函数中通过设置相应的寄存器来达到对相应外设(如I/O的输入、输出等)的控制目的。 二.实验目的 通过控制PIO的相关...
    99+
    2023-01-31
    入门 笔记 ARM
  • linux入门教程(3)
    (文:flynng)  3.4 进程管理  Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。  在Linux系统...
    99+
    2023-01-31
    入门教程 linux
  • Linux入门笔记3
    一、管理权限和归属1.权限概述文档归属所有者(u):拥有此文件/目录的用户-user所属组(g):拥有此文件/目录的组-group其他用户(o):除所有者、所属组以外的用户-other访问权限读取(r):允许查看内容-read写入(w):允...
    99+
    2023-01-31
    入门 笔记 Linux
  • Django 入门学习(3)
    在例4的基础上,我希望直接保存数据到数据库中。 Django自带了一个sqlite的数据库,已经配置好了 可以直接使用。使用方式和sqlalchemy类似,相当于一个内置的ORM框架。settings.py 默认已经绑定了sqlite3DA...
    99+
    2023-01-31
    入门 Django
  • 云服务器入门须知的3个技巧
    根据您的使用习惯和选择的云计算平台,您可能会发现,与使用服务器租用、云虚拟主机、VPS等业务承载方式不同,您仍然需要去熟悉全新的计算、存储、网络连接等多种组合。在设置云服务器搭载环境时,56云为您提供3个云服务器入门须知的技巧。  一、设置...
    99+
    2023-06-03
  • Redis_技术_超详细入门教程
    Redis_技术_超详细入门教程 一. NoSQL概述 1.在说Redis之前,让我们先去了解NoSQL,为什么呢 因为,主流NoSQL的产品中,就包含了我们即将学习的Redis     2. 什么是NoSQL ...
    99+
    2015-10-17
    Redis_技术_超详细入门教程
  • 怎样入门CSSSprites雪碧图技术
    怎样入门CSSSprites雪碧图技术,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。雪碧图被运用在众多使用了很多小图标的网站上。相对于把每...
    99+
    2022-10-19
  • 3.Python入门到精通
    算术操作符+ -*/%**//>>> a = 5>>> a = a + 3>>> a =+ 3>>> b=3>>> b -= 1>>>...
    99+
    2023-01-31
    入门 Python
  • 网络基础入门3
    路由 路由器的工作原理:1、路由器仅仅关心数据中的 “ 目标IP 地址” ; 2、路由器提取 目标IP地址,与 路由表中的条目...
    99+
    2023-01-31
    入门 基础 网络
  • Python3快速入门——(3)dict
    #先回忆下列表的操作animals=["cat","dog","rabbit"] #找到list中的某个值(第一种方法)for animal in animals: if(animal=="cat"): ...
    99+
    2023-01-31
    入门 快速 dict
  • Python入门3-变量1
    1.变量   例:bread = 5, print(bread)则输出5 2.元组(使用“()”进行赋值),赋值后,其值不可以再次修改   可理解为数组   breakfast = ("coffee","tea","eggs")   读取...
    99+
    2023-01-31
    变量 入门 Python
  • Python入门3-变量2
    1.字典(使用花括号定义)   dairy_section = {}   dairy_section["breakfast"] = ("break","milk")   dairy_section["lunch"] = ("noodles"...
    99+
    2023-01-31
    变量 入门 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作