一COM组件注册和卸载
1.Regsvr32.exe命令是用来对"Active控件"进行注册的
命令格式
注册 Regsvr32 路径/名称.dll
卸载 Regsvr32 /u 路径/名称.dll
2.ATL制作出的简单对象是".dll"形式
Visual Stduio在编译成这个dll时,对它自动进行了注册.
比如我注册一个
就成功注册啦, 卸载只要在前面加个 /u就行
如果你卸载了程序就用不了这个组件了,因为注册表找不到相关信息.
3.注册好后查看.打开注册表 reg就是注册检测 Edit就是编辑
RegEdit即可打开注册表
4.在HKEY_CALSSES_ROOT\CLSID\搜索组件的clsid
InprocServer32 放了DLL文件所在地址
ProgID 简称 COM组件的PropID
表示组件
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报错,
原文地址:http://blog.51cto.com/12158490/2106129