com元件從ole技術上發展而來:
object linking and embedding,物件連線與嵌入,簡稱ole技術。ole 不僅是桌面應用程式
整合,而且還定義和實現了一種允許應用程式作為軟體「物件」(資料集合和運算元據的函式)彼此進行「連線」的機制,這種連線機制和協議稱為元件物件模型
(com)。
com是一種規範而不是實現,是一種物件導向的程式設計標準(component objectmodule)在c++中com實際就為c++類,用它來實現介面進行操作。
com對於程式語言的唯一要求是必須能夠建立結構指標,並可以通過指標呼叫函式。com物件通過一組或多組相關函式來訪問物件中的資料,這些資料集合稱為介面。
介面是乙個純虛函式的定義,不能直接建立實體,每個介面都有乙個全域性唯一的guid值,可以通過這個值訪問介面。
所有的介面都是從乙個核心介面iunknown派生而來,iunknown介面包含了三個重要的方法:queryinte***ce、addref、release。
queryinte***ce用於說明這個元件是否支援特定介面,如果支援返回介面的指標,不支援返回乙個空指標。
addref和release實現對com的記憶體引用 的計數。當對com第乙個呼叫addref時,com被調入記憶體;當呼叫release,最後釋放com時,com會從記憶體釋放。
com元件在使用前應該進行註冊,它的一些資訊隨著com元件的註冊被寫入到登錄檔中,反註冊就是把元件的註冊資訊從登錄檔中刪除。windows系統中使用 regsvr32.exe對com元件進行註冊和反註冊,regsvr32.exe呼叫com元件的dllregisterserver註冊,呼叫dllunregisterserver進行反註冊。如com.dll為乙個元件,則控制台註冊:
regsvr32 com.dll
反註冊:
regsvr32 –ucom.dll
com元件的規則:
1、 實現iunknown規則。com元件必須實現iunknown介面。
2、 記憶體管理規則。管理記憶體即管理指標,介面指標的壽命管理通過呼叫每個com介面中的addref()和release()兩種方法來實現。
3、 引用計數規則。 引用程式通過計數跟蹤com例項,保證符合com規範。
com元件的設計
vs中使用atl方便設計元件。
atl,active template library活動模板庫,是一種微軟
程式庫,支援利用c++語言編寫asp**以及其它activex程式。通過活動模板庫,可以建立com
元件,然後通過asp頁面中的指令碼
對com物件進行呼叫。這種com元件可以包含屬性頁
、對話方塊等等控制項。
com元件的呼叫之 工廠化方法呼叫介面
工廠化函式
stdapi cogetclassobject
(refclsidrclsid, //元件的clsid值
worddwclscontext, //元件類別
coserverinfo*pserverinfo, //伺服器資訊,預設為null
refiidriid, //工廠方法識別符號
lpvoid*ppv, //com元件工廠指標
)呼叫了cogetclassobject之後得到了iclassfactory介面指標,使用iclassfactory介面呼叫createinstance得到呼叫的指標介面。
hresult createinstance
( iunknown*punkouter, //指向unknown介面,與cocreateinstance相同
refiidriid, //呼叫介面識別符號
void** ppvobject //介面指標
)示例:
mycom元件含有igetres介面,該介面含有hello()方法,igetre***介面,該介面還含有helloex()方法,使用工廠化方法呼叫com介面方法。
coinitialize(null);
hresult hr;
clsid clsid;
//得到mycom元件igetres介面指標的clsid號
hr = clsidfromprogid(olestr(「mycom.getres」),&clsid);
//首先說明i乙個igetres介面、igetre***介面和類工廠介面
igetres* ptr;
igetre**** ptrex;
iclassfactory* p_classfactory;
//首先需要得到com 物件工廠(iclassfactory)指標
hr = gogetclassobject(clsid, clsctx_inproc_server,null, iid_iclassfactory, (lpvoid*) &p_classfactory);
//使用工廠化的方法得到igetres介面指標
p_classfactory->createinstance(null,__uuidof(igetres), (lpvoid*) &ptr);
//使用工廠化的方法得到igetre***介面指標
p_classfactory->createinstance(null,__uuidof(igetre***), (lpvoid*)&ptrex);
//呼叫igetres介面的hello函式
ptr->hello();
//呼叫igetre***介面的helloex()函式
ptrex->helloex();
couninitialize();
com元件使用api呼叫介面函式
stdapi cocreateinstance
( refclsid rclsid, //元件的clsid值
lpunknownpunkouter, //指向unknown介面
dworddwclscontext, //元件類別
refiidriid, //呼叫介面識別符號
lpvoid*ppv, //介面指標
)punkouter 如果為null, 表明此物件不是聚合式物件的一部分。如果不是null,則指標指向乙個聚合式物件的iunknown介面
dwclscontext 引數一般設定為clsctx_inproc_server
riid 是介面的guid值,可以通過以下函式得到:
__uuidof(expression)
uuidof 得到指向expression的guid值。
使用api 呼叫介面igetres的方法hello()的例項:
coinitialize(null);
clsid clsid;
//得到mycom元件igetres介面指標的clsid號
hresult hr = clsidfromprogid(olestr(「mycom.getres」),&clsid);
igetres *ptr;
//得到介面igetres的指標
hr = cocreateinstance(clsid, null,clsctx_inproc_server, __uuidof(igetres), (lpvoid*) &ptr);
//呼叫igetres介面的hello()函式
ptr->hello();
couninitialize();
原創 單點登陸 SSO 元件的設計與實現二
新增登出流程圖 2008 02 02 上面是整體流程圖,這個sso元件在安全上有了很充分的考慮,可以說是非常安全,那麼下面看看登入請求資料的格式,和為何它能保證真實性和完整性 這樣,當資料在傳輸過程中,如果站點編號,使用者編號,請求號任意一項做任何的修改,當認證中心接收到資料之後,均無法與簽名資訊進...
設計與實現
為了概念上的完整性,系統的設計必須有乙個人,最多2個人來完成,問題來了,有的人會認為,那其他人員幹什麼?創意都被這1 2個人壟斷,剩下的實現過程就很枯燥了.實際上,經驗已經表明,沒有規矩,不成方圓 最差的建築往往是那些預算遠遠超標的專案,因為這些專案一開始的概念就不完整.外部的體系結構的強制性 設計...
便簽的設計與實現
2.模型設計 3.資料庫設計 便簽應用很廣泛,受到許多任務作人士和學生的喜愛。它可以對事件進行簡單分類,還可以分享給別人,便簽的出現使我們生活變得更加有條理。1.1 功能性需求 功能性產品需求,主要面向基本需求,具有生命週期長,需求穩定,便於 產品改型少的特點。便簽 1.2 創新性需求 創新性產品需...