因為要做一個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數組中哪個參數導致了錯誤。