ActiveX組件及其注冊
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
前言:隨著計算機軟件編程技術的發展和應用的需要,人們越來越倚重于ActiveX組件。那么什么是ActiveX組件呢?在此筆者給出簡單的介紹。另外,關于如何對ActiveX組件進行注冊,在目前所見到的資料中間,難以得到一個比較完全答復。尤其,關于ActiveX EXE 注冊的文章更是微乎其微,而且即使給出的方法也比較片面、單一。鑒于此,筆者通過大量的查閱和比較深入的研究,在此對ActiveX組件的注冊問題給出一個比較完全、系統的總結。希望給對此感興趣的朋友一個參考。
一.概述 在接下來的部分,首先將就ActiveX組件的概念以及它的分類進行簡要的介紹,從而讓讀者對ActiveX組件有一個概念上的把握。隨后,將就如何注冊ActiveX組件的問題進行比較深入詳細的解釋。分別給出ActiveX 控件、ActiveX DLL、ActiveX EXE的具體注冊方法。并在此基礎上,對如何在制作安裝程序并安裝后,實現對 ActiveX組件的注冊給出了若干解決方案。 二.ActiveX組件的概念 在我們平常的閱讀和編程學習中,我們經常可以看到諸如“ActiveX控件”,“ActiveX組件”等名詞。那么什么是“ActiveX控件”,什么是“ActiveX組件”呢,它們有什么區別呢? 首先,我們應該知道,組件是建立在 ActiveX技術上的代碼的獨立單元,用于通過特定的接口提供特定的一組服務。它提供客戶端在運行時所請求的對象。在 Remote Data Service 中,當組件包括支持業務進程的關鍵字邏輯時也被稱為“業務對象”。 其次,ActiveX是使軟件組件能夠在網絡環境中交互作用而與創建組件的語言無關的一套封裝技術。實現ActiveX 的基礎是“組件對象模型”(Component Object Model ,縮寫為COM)。它也是提供封裝 COM組件并將其置入應用程序(如(但不限于)Web 瀏覽器)的一種方法。 最后,上面一段話中提到的COM(Components Object Model)是軟件組件互相通訊的一種方式。它是一種二進制和網絡標準,允許任意兩個組件互相通訊,而不管它們是在什么計算機上運行(只要計算機是相連的),不管各計算機運行的是什么操作系統(只要該操作系統支持 COM),也不管該組件是用什么語言編寫的。COM 還提供了位置透明性:在編寫組件時,其他組件是進程內 DLL、本地 EXE 還是位于其他計算機上的組件,都不會產生太大影響。 這樣以來,我們可以給ActiveX組件(ActiveX component)一個定義,就是:一個應用程序或開發工具,可以使用另一個應用程序支持的對象,或者提供自己的對象供另一個應用程序使用。以前這些程序和對象稱為“OLE 自動服務程序”和“OLE 自動服務器”。 至于ActiveX控件,則只是ActiveX組件的一個分類,是一個標準的用戶接口元素,是具有 .OCX 文件擴展名或者可插入對象的文件,能夠快速地把窗體和對話框組裝起來;當使用自定義控件對話框將其增加到工程中去時,工具箱將被擴展。在以前ActiveX控件被稱作 OLE 控件。ActiveX 控件還使 Internet 更加生動,為 World Wide Web 頁增加了有趣的新功能。 三.ActiveX組件的分類 ActiveX組件可以分為三類: ● ActiveX控件 ● ActiveX文檔 ● 代碼成分(OLE自動服務器) (1)ActiveX控件 可以從無到有被用戶完全建立,它能被建立在另一個控件之上,或者它可容納多個已經有的控件。比如 VB中的ActiveX控件就是建立在VB的用戶控件對象上的。當創建一個ActiveX控件時,就創建了一個帶有擴展名為 .ctl 的控件類文件。我們通常使用這種文件來創建實際的控件,其擴展名為 .ocx 。 (2)ActiveX文檔 通常,在具體的編程環境如VB 、VC++中,可以用傳統文檔的語義學來創建完全的應用程序。換句話說,它不僅有應用程序的功能,而且還有文檔性能的靈活性 ─ 當用戶打開一個 ActiveX文檔時,將不僅擁有應用程序的全部功能,而且能保持和發布應用程序原有數據的“備份”,因而,“文檔”實際上是主動的。比如, VB的ActiveX文檔是建立在VB用戶文檔的基礎上的。創建一個ActiveX文檔時,用帶有擴展名 .dob 的文件保存。VB使用這種DOB文件來創建EXE或DLL文件,這種EXE或DLL文件可以為ActiveX文擋提供實際的代碼。另外VB生成一個帶擴展名 .vbd 的說明文件,它對ActiveX文檔進行描述,用主應用程序可以打開這個文件。對于ActiveX文檔,可以讓用戶保存數據,這些數據被存在VBD文件里。 (3)代碼成分 以前被稱作OLE自動服務器。這些對象可以讓用戶在其他程序里使用其代碼。比如,有一個陳列在代碼成分里的時鐘例程,這樣以來此例程可以被其他程序使用。代碼成分(ActiveX EXE, ActiveX DLL)能夠支持屬性與方法。 四.建立ActiveX組件的選擇 ActiveX組件的各個內容,它們的應用是不同的。那么如何進行選擇,以來確定究竟該創建那種組件呢? 首先,在這里我們務必弄清楚ActiveX組件的運行方式,并知道相應的特點。一般來說,ActiveX組件有兩種運行方式:它們是進程外服務器運行和進程內服務器運行。 如果把一個ActiveX組件作為一個可執行文件(EXE文件)的一部分,那么它就是一個進程外服務器并在自己的進程內運行。若把它作為一個動態鏈接庫(DLL文件)的一部分,則它是一個進程內服務器并作為客戶應用程序在統一進程里運行。若用戶的ActiveX組件是一個進程外服務器,他就是一個可以單獨運行的EXE文件。使用進程內服務器的應用程序通常比使用進程外服務器的應用程序運行速度快,因為應用程序沒有通過進程邊界去使用對象屬性,方法與事件。 如果將建立的ActiveX文檔作為一個進程內組件(DLL文件),進程內組件的性能超過同樣編譯成EXE的組件。另外,如果多個程序訪問同一個EXE文件,將會覆蓋全局數據;如果他們都有自己的進程內服務器,這種事情不會發生。 客戶應用程序和內進程組件共享相同的內存空間,所以在調試內進程代碼部件的方法時,可以用客戶應用程序的堆棧輸參數。而對于外進程組件來說,在調試代碼部件的過程中,方法的參數必須被移動來通過兩個進程間的內存界線,這被稱為marshaling。 這樣,我們可以得出如下關于如何選擇所創建組件類型的結論: (1)若想建立一個在可調用的代碼中提供例程的不可視組件,可以建立一個代碼組件(ActiveX EXE 或AtiveX DLL). (2)若想建立一個能在同一個進程中與應用程序運行的組件, 可以建立一個AtiveX DLL. (3)若想建立一個能服務多個應用程序又能在一臺遠程計算機上運行的組件,可以建立一個AtiveX EXE。 (4)若想建立一個可視組件,并在設計時能被拖動到一個應用程序中,可建立一個AtiveX 控件。 (5)若想建立一個可視組件,并在運行時能接受一個應用程序窗口,可建立一個ActiveX 文檔。 至于創建組件之后,如何編程,如何被使用,可以參照有關編程方面的書籍。在這里,我們假設ActiveX組件的設計已經完成,然后對ActiveX組件的注冊進行較為詳細的討論。 五.ActiveX組件注冊的幾種方法 不同的ActiveX組件,它們注冊有著不同的方法,現在就針對ActiveX控件、ActiveX DLL 、ActiveX EXE三種不同的組件分別給出解決方案。 1.ActiveX控件的注冊 ActiveX 控件與開發平臺無關,在一種編程語言中開發出來的ActiveX 控件,幾乎不作任何修改,便可以在另一種編程語言中使用。但是ActiveX 控件被開發出來以后,要想在Windows中被正確使用,首先必須將控件文件復制到硬盤中,然后在Windows中進行注冊。未在Windows中注冊過的ActiveX 控件是不能被使用的。一般注冊VB6.0 ActiveX 控件的方法有如下幾種: (1)使用Regsvr32.exe 程序對VB ActiveX 控件進行注冊。 該文件位于Windows目錄的system子目錄下。使用方法如下:點擊“開始”,在彈出的菜單中再點擊“運行”,在出現的對話框中輸入以下命令: <控件路徑和ActiveX 控件文件名> 注冊一個ActiveX 控件。此處 regsvr32的路徑名可以省略。而且一般可將被注冊的ActiveX 控件拷貝到\windows\system下,這樣我們也不用在注冊時輸入控件的路徑了。 如果想要解除對某一個ActiveX 控件的注冊,只需要在regsvr32后面加一個參數“/u”,即 <被注冊過的ActiveX 控件文件名> 。 (2)利用某些編程環境中的瀏覽功能。比如在VB6.0中可以點擊界面上的“工程”,在彈出的下拉菜單中,點擊“部件”一項,隨后出現了一個新的界面。在此界面上利用“瀏覽”按鈕,找到并選中需要注冊的控件,確定后便注冊到“部件”界面的“控件”欄里。 利用上面兩種方法進行控件注冊后,便可以讓部件開發人員在實際的編程中,使用該控件了。 (3)使用安裝程序制作軟件——InstallShield 。使用 Regsvr32.exe 程序來注冊ActiveX 控件,以及利用“瀏覽”來注冊,雖然簡單,但是都需要手工注冊,在不用時,還需要手工解除,所以對于一個使用了該控件的應用程序來說并不實用。一般大型的應用軟件都需要一個安裝程序,在安裝程序中解決ActiveX 控件注冊就非常實用了。使用InstallShield可以制作出專業級的安裝程序,還可以注冊其中的ActiveX 控件;而且卸載軟件時,可以自動注銷以前注冊的ActiveX 控件。其做法就是按照InstallShield 的向導,進行安裝程序的制作,在進行到最后一步,點擊“Finish”后,“InstallShield”將進行下一步的“詳細定制”。選擇“File Groups”選項,將其中包含需要自注冊ActiveX控件文件項的“Self-Registered”屬性改為“yes”. (4)安裝過程中的自注冊。 ActiveX控件在安裝的時候必須被注冊,方可以在應用程序中被調用。往往利用編程工具自帶的安裝制作工具可以達到這個目的。仍以VB6.0為例。利用VB6.0本身自帶的創建安裝程序的工具軟件:Package & Deployment Wizard。只要將ActiveX控件包含在發布的文件中間,Package & Deployment Wizard將根據需要自動將該控件打成自注冊文件的屬性。萬一,我們沒有成功的話,可以修改安裝程序的安裝文件列表 setup.lst。將相應宏中的參數設置為DLLSelfRegister。如果不需要自注冊,可以將該項刪除(注意逗號要保留)。 例如下面是作者自己編的一個ActiveX控件,利用上述方法創建安裝程序后,其后面的參數變為: [Setup1 Files] File1=@clock1.ocx,$(WinSysPath),$(DLLSelfRegister),$(Shared),2/19/01 9:27:30 AM,36864,1.0.0.0 其中,加粗的一項 $(DLLSelfRegister) 就是標明自注冊的宏參數設置。可以手工加或刪。 (5)補充一點。有些公司開發的ActiveX控件注冊需要利用附帶的專門的工具軟件。運行該工具,就可以將相應的ActiveX控件注冊。這仍然屬于手工注冊,這些ActiveX控件被發布時,一般享有版權,同時會有專門的說明。 2.ActiveX DLL的注冊 ActiveX DLL的注冊與ActiveX控件的注冊基本上相似,上述用于ActiveX控件注冊的方法基本都適用于ActiveX DLL的注冊。在此可以參照上述有關ActiveX控件注冊的方法進行注冊。 3.ActiveX EXE的注冊 作為一種進程外運行的組件,ActiveX EXE的注冊方法異于ActiveX控件和ActiveX DLL的注冊,并且在運用中有一定的難度。在此,將它們的注冊方法總結如下: (1)“瀏覽”的方法。以VB6.0為例。在VB6.0編程界面上,進入“工程”,在彈出的下拉菜單中間選擇“引用”,然后在出現的新界面上點擊“瀏覽”,找到并選中需要注冊的組件,確定后,便可以在列表中間看到對應項了。 (2)直接運行的方法。注冊進程外組件ActiveX EXE時,只要在VB6.0的環境中運行一下該組件代碼,便可以實現注冊了。這時ActiveX EXE的信息被加入到Windows注冊表中。但是,必須注意,此信息只是在VB開發環境中運行此程序時被臨時加入。當程序停止時,有關如何訪問這些對象的信息便從系統中清除掉。 (3)利用安裝制作工具。比如在VB6.0中,可以利用VB6.0本身自帶的創建安裝程序的工具軟件:Package & Deployment Wizard。在創建安裝程序的過程中,自動將其變為自注冊。若不然,同樣可以修改安裝程序的安裝文件列表 setup.lst。將相應宏中的參數設置為EXESelfRegister。如果不需要自注冊,可以將該項刪除(注意逗號要保留)。 例如下面是作者自己編的一個進程外組件 ,利用上述方法創建安裝程序后,其后面的參數變為: [Setup1 Files] File1=@CommThread.exe,$(WinSysPath),$(EXESelfRegister),$(Shared),12/25/00 8:47:44 PM,57344,1.0.0.0 其中,加粗的一項 $(EXESelfRegister) 就是標明自注冊的宏參數設置。可以手工加或刪。 (4)如果打算把進程外服務器安裝到另外一臺機器上自注冊,而且脫離編程環境時,可以先將文件拷貝到另外機器上,執行時在命令行上加上參數 “ /regserver”,如果取消注冊,可以在命令行上加上“ /unregserver”。使用 /regserver命令選項注冊進程外COM服務器時,可以不去理會手工啟動時程序工作的正常方式。Sub Main或Class_Initialize程序都不會被調用,只有由當該編程環境包括在EXE文件中的注冊邏輯才會運行。 六.總結 上面,就日常的學習中所理解的有關ActiveX 組件方面的概念性的東西,作了一些簡單的總結。在,注冊方面,給出了一些較為實用的方法。當然,我們也可以自己動手,親自編制一些小程序,實現ActiveX 控件的注冊。如在VC++中,使用Windows API函數LoadLibrary載入ActiveX控件;再使用GetProcAddress函數獲取ActiveX 控件中注冊函數DLLRegisterServer(注銷函數為DLLUnRegisterServer)指針;最后再調用注冊函數DLLRegisterServer(或注銷函數為DLLUnRegisterServer)。感興趣的,可以參照相關的資料,自己動手進行編程。 當然,在實際編程應用中,往往需要自注冊。對于ActiveX 控件和ActiveX DLL可以在制作安裝程序后,安裝時自動注冊。而對于ActiveX EXE 可能要麻煩一些,我們不可能 在每次運行軟件時,先在編程環境中,通過代碼的編譯或瀏覽來注冊。通過實踐,總結出如下的方法來實現自注冊: (1)利用編程工具自帶的制作安裝程序的工具,來制作安裝程序,安裝時,可以自動實現ActiveX EXE的自注冊。 (2)利用加上參數 /regserver,實現自注冊。在VB6.0編程中,當需要用到ActiveX EXE時,通過VB6.0的系統函數shell(),同時進行調用和自注冊。命令格式為: shell “[path\] filename /regserser” 卸載時,只需將 /regserser 替換為 /unregserser就行了。假如組件文件與應用程序在同一個目錄中或在 \windows\system\下,組件文件路徑名可以省略。 (3)假如想用Installshield為應用程序制作專業級的安裝程序,同時又需要ActiveX EXE的自注冊,可以將應用程序用Installshield打包,而ActiveX EXE用VB6.0打包,制作出兩個安裝程序。在使用時,兩個安裝程序都運行一次,這樣,也可以實現要求,只是比較麻煩。 上面是筆者在實際編程實踐中所總結出的經驗,不足之處,歡迎批評指正。 該文章在 2011/3/11 23:12:30 編輯過 |
關鍵字查詢
相關文章
正在查詢... |