元件的設計與實現

2021-06-18 14:52:00 字數 3632 閱讀 4824

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 創新性需求 創新性產品需...