COM組件的運行機制

COM組件的運行機制
  構造一個創建COM組件的最小框架結構


    IUnknown *pUnk=NULL;
    IObject *pObject=NULL;
    CoInitialize(NULL);
    CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown, (void**)&pUnk);
    pUnk->QueryInterface(IID_IOjbect, (void**)&pObject);
    pUnk->Release();
    pObject->Func();
    pObject->Release();
    CoUninitialize();

  這就是一個典型的創建COM組件的框架,看看CoCreateInstance內部做了一些什么事情。以下是它內部實現的一個偽代碼:


    CoCreateInstance(....)
    {
    .......
    IClassFactory *pClassFactory=NULL;
    CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
    pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
    pClassFactory->Release();
    ........
   }

  它的意思就是先得到類廠對象,再通過類廠創建組件從而得到IUnknown指針。繼續深入一步,看看CoGetClassObject的內部偽碼:


   CoGetClassObject(.....)
   {
    //通過查注冊表CLSID_Object,得知組件DLL的位置、文件名
    //裝入DLL庫
    //使用函數GetProcAddress(...)得到DLL庫中函數DllGetClassObject的函數指針。
    //調用DllGetClassObject
   }
    DllGetClassObject是干什么的,它是用來獲得類廠對象的。只有先得到類廠才能去創建組件.
    下面是DllGetClassObject的偽碼:
    DllGetClassObject(...)
    {
    ......
    CFactory* pFactory= new CFactory; //類廠對象
    pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);
    //查詢IClassFactory指針
    pFactory->Release();
    ......
    }
    CoGetClassObject的流程已經到此為止,現在返回CoCreateInstance,看看CreateInstance的偽碼:
    CFactory::CreateInstance(.....)
    {
    ...........
    CObject *pObject = new CObject; //組件對象
    pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
    pObject->Release();
    ...........
    }

  

  (7) 一個典型的自注冊的COM DLL所必有的四個函數
  DllGetClassObject:用于獲得類廠指針
  DllRegisterServer:注冊一些必要的信息到注冊表中
  DllUnregisterServer:卸載注冊信息
  DllCanUnloadNow:系統空閑時會調用這個函數,以確定是否可以卸載DLL

  DLL還有一個函數是DllMain,這個函數在COM中并不要求一定要實現它,但是在VC生成的組件中自動都包含了它,它的作用主要是得到一個全局的實例對象。

  (8) 注冊表在COM中的重要作用
  首先要知道GUID的概念,COM中所有的類、接口、類型庫都用GUID來唯一標識,GUID是一個128位的字串,根據特制算法生成的GUID可以保證是全世界唯一的。 COM組件的創建,查詢接口都是通過注冊表進行的。有了注冊表,應用程序就不需要知道組件的DLL文件名、位置,只需要根據CLSID查就可以了。當版本升級的時侯,只要改一下注冊表信息就可以神不知鬼不覺的轉到新版本的DLL。

轉載于:https://www.cnblogs.com/yep3575/p/6232903.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

申請去國外讀博士

必須要做的事情是: 考過GRE和TOEFL 準備推薦信 個人CV 聯系導師一般就是發郵件 轉載于:https://www.cnblogs.com/zhulinmails/p/5078695.html

動態編譯

下面的demo就涵蓋了動態編譯和運行類的過程 package 動態編譯; import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader; import javax.tools.JavaCompiler;import javax.tools.ToolProvider; public class Demo { public static void main(Stri…

python怎么打開spyder_Python開發環境Spyder安裝方法

Spyder(Scientific PYthon Development EnviRonment)是一個強大的交互式 Python 語言開發環境,提供高級的代碼編輯、交互測試、調試等特性,支持包括 Windows、Linux 和 OS X 系統。 本文在只安裝過python2.7的Win7環境下進行安裝Spyder,其他環…

矩陣、向量求導法則

復雜矩陣問題求導方法:可以從小到大,從scalar到vector再到matrix。 x is a column vector, A is a matrix practice: 轉載于:https://www.cnblogs.com/vincentQin/p/5406010.html

java字符函數_java字符串函數用法匯總

替換字符串中的字符例如有如下x的字符串String x "[kllkklk\kk\kllkk]";要將里面的“kk”替換為,可以使用兩種方法得到相同的結果replace(CharSequence target, CharSequence replacement) —— x.replace("kk", "")replaceAll(Stri…

[Vue]Scoped Css與Css Modules的區別

均為解決CSS全局作用域問題&#xff08;樣式沖突&#xff08;污染&#xff09;&#xff09;的一個解決方案。 1.Scoped CSS 當 <style> 標簽有 scoped 屬性時&#xff0c;相當于在元素中添加了一個唯一屬性用來區分。 <style scoped> .example {color: red; } <…

mysql數據庫-mysql數據定義語言DDL (Data Definition Language)歸類(六)

0x01 創建數據庫并指定字符集和排序規則 -- 三種實例寫法 create database temptab2 character set utf8 collate utf8_general_ci; create database temptab3 charset utf8 collate utf8_general_ci; create database temptab4 character setutf8 collate utf8_general_ci; 查…

vue antd admin怎么切換到basic分支_vue菜鳥從業記:前端如何與后端哥們進行接口聯調...

最近我的朋友王小閏進入一家新的公司&#xff0c;正好公司項目采用的是前后端分離架構&#xff0c;技術棧是王小閏非常熟悉的vue全家桶&#xff0c;后端用的是Java語言。在前后端開發人員碰面之后&#xff0c;協商確定好了前端需要的數據接口(扯那么多&#xff0c;其實也就是關…

ASP.NET AntiXSS的作用

XSS跨站腳本攻擊是指用戶輸入HTML編碼對網站進行跨站攻擊。通過使用FCKeditor、FreeTextBox、Rich TextBox、Cute Editor、TinyMCE等等Html編輯器&#xff0c;用戶可以輸入一些危險字符&#xff0c;注入到網站中&#xff0c;形式XSS。&#xff08;一般的解決辦法是使用BBCode的…

p1358

這是一道二維樹狀數組模板題。 需要注意的可能只有這些xy有可能為零。那每次輸入之后全部&#xff0c;相當于全部向右下角移了一位。 那就直接給代碼了呦。 using namespace std; int c[1050][1050],n,m; int i,f; int a1,b1,a2,b2,tx,ty,tk; int ans; int lowbit(int x) {retu…

java中對象的生存期_深入理解Java虛擬機-判斷對象是否存活算法與對象引用

我們知道Java中的對象一般存放在堆中&#xff0c;但是總不能讓這些對象一直占著內存空間&#xff0c;這些對象最終都會被回收并釋放內存&#xff0c;那么我們如何判斷對象已經成為垃圾呢&#xff1f;這篇文章會提出兩種算法解決這個問題。另外&#xff0c;本文還要談一談對象引…

大數據高效復制的處理案例分析總結

一個老客戶提出這樣的需求&#xff0c;希望將SQLServer中的某個表的數據快速復制到SQLite數據庫里面以便進行定期的備份處理&#xff0c;數據表的記錄大概有50多萬條記錄&#xff0c;表有100個字段左右&#xff0c;除了希望能夠快速做好外&#xff0c;效率是第一位的&#xff0…

@autowired注解注入為null_Intellij IDEA中Mybatis Mapper自動注入警告的6種解決方案

相信使用Mybaits的小伙伴們一定會經常編寫類似如下的代碼&#xff1a;可以看到 userMapper 下有個紅色警告。雖然代碼本身并沒有問題&#xff0c;能正常運行&#xff0c;但有個警告總歸有點惡心。本文分析原因&#xff0c;并列出解決該警告的幾種方案。原因眾所周知&#xff0c…

五 Python之socket網絡編程

<1>socket概念 socket通常也稱作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。ocket本質上就是在2臺網絡互通的電腦之間&#xff0c;架設一個通道…

致敬2016,擁抱2017

2016年5月10號加入現在的團隊&#xff0c;到今天2016年12月31號&#xff0c;已經過去了接近8個月。這整個期間&#xff0c;我們團隊都只有我一個前端工程師&#xff0c;我從剛開始的忐忑不安、壓力極大&#xff0c;到現在基本上手&#xff0c;我們團隊做的項目雖然不大&#xf…

你如何在java中獲取線程堆_如何在Windows上獲取未在控制臺中運行的Java進程的線程和堆轉儲...

問題我有一個Java應用程序&#xff0c;我從控制臺運行&#xff0c;然后控制臺執行另一個Java進程。我想獲得該子進程的線程/堆轉儲。在Unix上&#xff0c;我可以做akill -3 但是在Windows AFAIK上獲取線程轉儲的唯一方法是在控制臺中使用Ctrl-Break。但這只會讓我轉移父進程&am…

html ie亂碼_Java 0基礎入門(初識Html)

在學習Java之前&#xff0c;我們需要了解一定的前端知識。畢竟頁面才是用戶真正看到的&#xff0c;而且也是體現Java后端邏輯結果的地方。學習HTML后&#xff0c;能夠制作界面美觀大方的靜態網站(更復雜的功能需要JavaScript腳本一起來實現)。HTML制作的網頁。所需要的Html開發…

常用自動化框架簡單的分析與介紹

目前常用的可用于APP自動化測試的框架有以下幾個&#xff1a; 1、Monkey是Android SDK自帶的測試工具&#xff0c;在測試過程中會向系統發送偽隨機的用戶事件流&#xff0c;如按鍵輸入、觸摸屏輸入、手勢輸入等)&#xff0c;實現對正在開發的應用程序進行壓力測試&#xff0c;也…

linux一步一腳印---more、less、head、tail

一、more 文件內容或輸出查看命令more 是我們最常用的工具之一&#xff0c;最常用的就是顯示輸出的內容&#xff0c;然后根據窗口的大小進行分頁顯示&#xff0c;然后還能提示文件的百分比&#xff1b; [rootlocalhost ~]# more /etc/profile 1、more 的語法、參數和命令&#…