CoCreateInstance具體內部實現

2021-08-27 15:50:35 字數 2187 閱讀 7990

cocreateinstance(....) 

這段話的意思就是先得到類廠物件,再通過類廠建立元件從而得到iunknown指標。繼續深入一步,看看cogetclassobject的內部偽碼:

cogetclassobject(.....) 

/// dllgetclassobject是幹什麼的,它是用來獲得類廠物件的。只有先得到類廠才能去建立元件.

/// 下面是dllgetclassobject的偽碼:

dllgetclassobject(...)

/// cogetclassobject的流程已經到此為止,現在返回cocreateinstance,看看createinstance的偽碼:

這部分我們將構造乙個建立com元件的最小框架結構,然後看一看其內部處理流程是怎樣的

iunknown *punk=null;

iobject *pobject=null;

coinitialize(null);

cocreateinstance(clsid_object, clsctx_inproc_server, null, iid_iunknown, (void**)&punk);

punk->queryinte***ce(iid_iojbect, (void**)&pobject);

punk->release();

pobject->func();

pobject->release();

couninitialize();

cocreateinstance(....)

這就是乙個典型的建立com元件的框架,不過我的興趣在cocreateinstance身上,讓我們來看看它內部做了一些什麼事情。以下是它內部實現的乙個偽**:

cogetclassobject(.....)

dllgetclassobject是幹什麼的,它是用來獲得類廠物件的。只有先得到類廠才能去建立元件.

下面是dllgetclassobject的偽碼:

dllgetclassobject(...)

cogetclassobject的流程已經到此為止,現在返回cocreateinstance,看看createinstance的偽碼:

cfactory::createinstance(.....)

這段話的意思就是先得到類廠物件,再通過類廠建立元件從而得到iunknown指標。繼續深入一步,看看cogetclassobject的內部偽碼:

上圖是從com+技術內幕中copy來的乙個例圖,從圖中可以清楚的看到cocreateinstance的整個流程。

(7) 乙個典型的自註冊的com dll所必有的四個函式

dllgetclassobject:用於獲得類廠指標

dllregisterserver:註冊一些必要的資訊到登錄檔中

dllunregisterserver:解除安裝註冊資訊

dllcanunloadnow:系統空閒時會呼叫這個函式,以確定是否可以解除安裝dll

dll還有乙個函式是dllmain,這個函式在com中並不要求一定要實現它,但是在vc生成的元件中自動都包含了它,它的作用主要是得到乙個全域性的例項物件。

上圖是從com+技術內幕中copy來的乙個例圖,從圖中可以清楚的看到cocreateinstance的整個流程。

(8) 登錄檔在com中的重要作用

首先要知道guid的概念,com中所有的類、介面、型別庫都用guid來唯一標識,guid是乙個128位的字串,根據特製演算法生成的guid可以保證是全世界唯一的。 com元件的建立,查詢介面都是通過登錄檔進行的。有了登錄檔,應用程式就不需要知道元件的dll檔名、位置,只需要根據clsid查就可以了。當版本公升級的時侯,只要改一下登錄檔資訊就可以神不知鬼不覺的轉到新版本的dll。

參考了

CoCreateInstance具體內部實現

cpp view plain copy print?cocreateinstance cocreateinstance 這段話的意思就是先得到類廠物件,再通過類廠建立元件從而得到iunknown指標。繼續深入一步,看看cogetclassobject的內部偽碼 cpp view plain copy...

CoCreateInstance具體內部實現

原文出處 cocreateinstance 這段話的意思就是先得到類廠物件,再通過類廠建立元件從而得到iunknown指標。繼續深入一步,看看cogetclassobject的內部偽碼 cpp view plain copy print?cogetclassobject dllgetclassobj...

CoCreateInstance具體內部實現

cpp view plain copy print?cocreateinstance cocreateinstance 這段話的意思就是先得到類廠物件,再通過類廠建立元件從而得到iunknown指標。繼續深入一步,看看cogetclassobject的內部偽碼 cpp view plain copy...