天天看點

COM元件設計與應用(十)

<b>一、前言</b>

    終于寫到了第十回,我也一直期盼着寫這回的内容耶,為啥呢?因為自動化(automation)是非常常用、非常有用、非常精彩的一個 COM 功能。由于 WORD、EXCEL 等 OFFICE 軟體提供了“宏”的功能,就連我們使用的VC開發環境也提供了“宏”功能,更由于 HTML、ASP、JSP 等都要依靠腳本(Script)的支援,更展現出了自動化接口的重要性。

    如果你使用 vc6.0 的開發環境,請閱讀前一回。

    如果你使用 vc.net 2003,請繼續......

<b>二、IDispatch接口</b>

    如果是編譯型語言,那麼我們可以讓編譯器在編譯的時候裝載類型庫,也就是裝載接口的描述。在第七回文章當中,我們分别使用了 #include 方法和 #import 方法來實作的。裝載了類型庫後,編譯器就知道應該如何編譯接口函數的調用了---這叫“前綁定”。但是,如果想在腳本語言中使用元件,問題就大了,因為腳本語言是解釋執行的,它執行的時候不會知道具體的函數位址,怎麼辦?自動化接口就為此誕生了---“後綁定”。

    自動化元件,其實就是實作了 IDispatch 接口的元件。IDispatch 接口有4個函數,解釋語言的執行器就通過這僅有的4個函數來執行元件所提供的功能。IDispatch 接口用 IDL 形式說明如下:(注1)

以上 IDispatch 接口函數的講解,我們留到後回中進行介紹。如何在元件程式中實作這些函數那?還好,還好,就象 IUnknown 一樣,MFC 和 ATL 都幫我們已經完成了。本回我們着重介紹元件的編寫,下回則介紹元件的調用方法。

<b>三、用 MFC 實作自動化元件</b>

    我寫的這整個系列文章---《COM 元件設計與應用》,多是用 ATL 寫元件程式,但由于自動化非常有用,在後續的文章中,還要給大家介紹元件的“事件”功能,還要介紹如何在 MFC 的程式中象 WORD 一樣支援“宏”的功能。這些都要用到 MFC,是以就給讀者唠一唠啦:-)

    3-1:建立一個解決方案

    3-2:建立一個 MFC DLL 項目,項目名稱為“Simple7”

COM元件設計與應用(十)

    3-3:一定要選擇附加功能中的“自動化”,切記!切記!

COM元件設計與應用(十)

    3-4:添加新類

COM元件設計與應用(十)

    3-5:在建立類中支援自動化

COM元件設計與應用(十)

<b>類名</b> 你随便寫個類名子啦

<b>基類</b> 一定要從 CComTarget 派生呀,隻有它才提供了 IDispatch 的支援

<b>自動化 - 無</b> 表示不支援自動化,你要選擇了它,那就白幹啦

<b>自動化 - 自動化</b> 支援自動化,但不能被直接執行個體化。後面在講解多個 IDispatch 的時候就用到它了,現在先不要着急。

<b>自動化 - 可按類型ID建立</b> 一定要選擇這個項目,這樣我們在後面的調用中,VB就能夠CreateObject(),VC就能夠CreateDispatch()對元件對象執行個體化了。注意一點,這個 ID 其實就是元件的 ProgID 啦。

    3-6:選擇接口,添加函數

COM元件設計與應用(十)

    3-7:添加函數。我們要寫一個整數加法函數Add()。

COM元件設計與應用(十)

    3-8:再增加一個轉換字元串大小寫的函數 Upper()。

COM元件設計與應用(十)

    3-9:好了,下面開始輸入程式代碼:

    3-10:編譯注冊

    如果上面的操作由于疏忽而發生了錯誤,那麼你可以手工進行改正。

其一、你可以打開 IDL 檔案進行修改,修改時要特别小心函數的聲明中,有一個[id(n)] 的函數序号,可不要亂了;

其二、同步修改 H/CPP 中的函數聲明和函數體;

其三、在CPP檔案中,根據情況也要修改 BEGIN_DISPATCH_MAP/END_DISPATCH_MAP()函數影射宏。

    正确編譯後,vc.net 2003 比 vc6.0 要聰明多了,它會自動注冊元件。如果複制到其它計算機上,你也需要手工執行 regsvr32.exe 進行注冊。

<b>四、用 ATL 實作雙接口元件</b>(操作方法和步驟,請參考《COM 元件設計與應用(六)》)

    4-1:建立一個 ATL 項目,項目名稱為“Simple8”

    4-2:選擇 DLL 類型、非屬性方式、不要選擇任何附加選項

    4-3:添加新類,選擇ATL 的簡單對象

    4-4:輸入簡稱和選項,選項按預設進行,也就是雙重接口方式(注2)

COM元件設計與應用(十)
COM元件設計與應用(十)

    4-5:增加函數。選擇接口、滑鼠右鍵菜單、添加方法...

Add([in] VARIANT v1, [in] VARIANT v2, [out, retval] VARIANT * pVal);

Upper([in] BSTR str, [out,retval] BSTR * pVal);

    關于Add()函數,你依然可以使用 Add([in] long n1, [in] long n2, [out,retval] long * pVal) 方式。但這次我們沒有使用 long ,而是使用了 VARIANT 做參數和傳回值。這裡我先賣個關子,往下看,就知道使用 VARIANT 的精彩之處了。

    4-6:完成代碼

    剛才賣的關子,現在開始揭密了......加法函數Add()不使用long類型,而使用VARIANT的好處是:函數内部動态判斷參數類型,如果是整數則進行整數加法,如果是字元串,則進行字元串加法(字元串加法就是字元串連接配接哈)。也就是說,如果參數是VARIANT,那麼我們就可以實作函數的可變參數類型呀。怪怪個嚨,真爽!

<b>五、腳本中調用舉例</b>

    打開“記事本”程式,輸入腳本程式,儲存為 xxx.vbs 檔案。然後在資料總管裡就可以輕按兩下運作啦。

COM元件設計與應用(十)

如果你有能力,也可以用 JScript 書寫上面的程式,然後儲存為 xxx.js 檔案,同樣也可以在資料總管裡運作。另外需要說明的一點是,腳本程式檔案的圖示(win 2000下)是 

COM元件設計與應用(十)

,如果你不是這樣的(有一個軟體叫“XX 解霸”。寫這款軟體的人水準太低,它居然使用 .vbs 的擴充名檔案作為它的資料流檔案,破壞了系統預設的檔案類型影射模式,咳......),那麼需要重新設定,方法是:

COM元件設計與應用(十)

<b>六、WORD 中使用舉例</b>

    6-1:錄制一段宏程式

COM元件設計與應用(十)
COM元件設計與應用(十)

    6-2:選擇“鍵盤”,當然你也可以把這個“宏”程式放到“工具欄”上去。這裡我們随便指定一個快捷鍵,比如Ctrl+Z

COM元件設計與應用(十)

    6-3:開始錄制了,下面你随便輸入點什麼東東。然後點“停止” 

COM元件設計與應用(十)

    6-4:接下來,我們執行菜單,選擇這個剛剛錄制的宏,然後編輯它

COM元件設計與應用(十)

    6-5:點“編輯”按鈕,輸入下面的程式:

COM元件設計與應用(十)

不做解釋了,你如果會一點點 VB ,就能看懂這個東東哈。然後儲存關閉 VBA 的編輯器(注4)。

    6-6:執行啦,執行啦,看看有什麼效果呀......

COM元件設計與應用(十)

然後按快捷鍵Ctrl+Z 

COM元件設計與應用(十)

    你已經擴充了 MS WORD 的功能啦,嘿啦啦啦啦,嘿啦啦啦,天空出彩霞呀......我們隻是舉了一個簡單的例子,其實這個例子并沒有什麼實際應用的意義,因為人家 WORD 本身就有大小寫轉換功能。但通過這個小例子,你可以體會出自動化元件的功能了,有夠厲害吧?!

<b>七、小結</b>

    沒小結!嘿嘿......上當喽:-)

繼續閱讀