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...