程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 看一小會兒COM所做筆記

看一小會兒COM所做筆記

編輯:Delphi

  因為要做一個ActiveX的東東,想想最後一次做ActiveX的東東都是兩年前的事,下午把《Delphi5開發人員指南》又翻出來看一下COM/Ativex章節,記錄了前面一部分的,後面以實例為主,就不記了。繼續看DotNet老
  
  COM、OLE、ActiveX到底有什麼區別?
  
COM是一組API和二進制標准,是其它相關技術的基石。
  OLE僅僅是指與對象鏈接和嵌入有關的技術,比如容器、服務器、就地編輯、拖放和菜單合並。
  ActiveX技術包括自動化(以前叫OLE自動化)控件、文檔、容器、腳本化以及幾個Internet技術。

  術語
  
在應用程序之間共享一大塊數據稱為一個OLE對象,能夠包含OLE對象的應用程序稱為OLE容器,而允許自己的數據被包含到其它應用程序中的程序則稱為OLE服務器。
  一個包含一個或者多個OLE對象的文檔稱為復合文檔。一個文檔可以包含OLE對象,也可以包含完整的應用程序,這稱為ActiveX文檔。

  線程模式
  每個COM對象都是在一個特定的線程模式下動作的。線程模式決定了一個對象在多線程模式環境下被操縱的方式。
  記住,僅僅在有關向導中選擇一種線程模式,並不能保證COM對象在那種線程模式下一定是安全的,必須自己編寫代碼來保證COM服務器在指定的線程模式下正常工作。這同樣需要借助於線程同步對象來保護COM對象中的全局變量或實例數據。

  接口
  
COM定義了一個對象的函數怎麼在內存布置的標准。這些函數被安排到虛擬表(VTABLE),類似於Delphi的虛擬方法表(VMT)。編程語言對每個VTABLE的描述就是所謂的接口。

  in-process COM服務器
  in-process COM服務器是DLL函數,可以創建COM對象供宿主應用程序使用。這種類型的COM服務器之所以被稱為in-process,是因為DLL函數與調用它的應用程序在同一個進程內。一個in-process服務器必須導出下列四種標准入口點函數:
  function DllRegisterServer: HResult; stdcall;
  function DllUnregsiterServer: HResult; stdcall;
  function DllGetClassaObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
  function DllCanUnloadNow: HResult; stdcall;

  out-of-process COM服務器
  
out-of-process COM服務器是可執行的,用來被其它的應用程序使用以創建COM對象。所謂out-of-process,是因為它們與客戶程序不在同一進程中,而是它們自己的過程中。

  IDispatch接口
  IDispatch接口的核心函數是Invoke()。當客戶獲取了一個自動化服務器的IDispatch指針後,它就可以調用Invoke()方法來執行服務器上的一個方法。DisID參數指定了要執行的訪求和調度號(dispatch ID)。IID參數目前未用。LocaleID參數包含了語言信息。Flags參數描述了要執行的方法的類型(一般的方法、屬性的讀訪問方法/寫訪問方法)。Params屬性包含了一個指針,指向一個TDisParams數組,指定了要傳遞給方法的參數。VarResult參數是一個指向OleVariant的指針,用於返回所調用方法的返回值。ExcepInfo是一個指向TExcepInfo記錄的指針,如果Invoke()返回DISP_E_EXCEPTION,則這個記錄包含了錯誤信息。如果Invoke()返回DISP_E_TYPEMISPATCH或DISP_E_PARAMNOTFOUND,ArgError參數指向一個整數的指針,該整數表示Params數組中哪個參數導致了錯誤。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved