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