COM技術入門(3)
一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)