1. 程式人生 > >COM技術入門(3)

COM技術入門(3)

c++ com 智能指針

(1)COM組件註冊卸載與智能指針


一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報錯,







COM技術入門(3)