最近由於自動化測試中要用到OCX控制項,所以一直在關注有關的內容。學起來才深刻體會到,儘管只是用RFT去調用OCX控制項的方法,也有很多的問題需要解決。今天接觸了一個jacob的函數:QueryInterface,費了2個小時才弄明白怎麼用,唉……。
要使用QueryInterface(),就必須知道iid,我理解的IID就是OCX中介面(interface )的GUID,全球唯一標識,它的調用形式如下:
import com.jacob.com.*;
import com.jacob.activeX.*;Dispatch events = comx.QueryInterface("{E2A3CC4A-DEF3-4272-9876-02BB032801C7}");
大家要注意的是,如果你獲得的iid是E2A3CC4A-DEF3-4272-9876-02BB032801C7,那麼在 QueryInterface中調用時必須用{}括起來。我就是一直沒弄明白這一點,費了我好大的勁。
接下來再說說iid的擷取,這也是曾經困擾我的地方。IID的概念很多教程說的都很清楚,GUID嘛,但是IID如何擷取卻很少有人說,正所謂越簡單的道理說的人越少吧。
我擷取IID的方法是用oleview工具。這個工具可以方便的查看OCX內部的屬性和方法。我這裡就不提供了,網上一搜一大堆。
查看OCX的方法是:首先開啟OLEVIEW,點擊功能表列中的“File—View Typelib”,在檔案對話方塊中選擇你OCX檔案,然後點擊“開啟”按鈕。這樣就OCX的屬性和方法就出現在你面前了。IID就在其中。在OLEVIEW中找到如下格式的語句:
[
odl,
uuid(00020420-0000-0000-C000-000000000046),
version(1.0),
helpstring("AAAAAA"),
dual,
oleautomation
]
interface XXXXX : IDispatch
由於這個OCX是公司的控制項,因此關鍵資訊還是做了一些修改。大家看到uuid後面的那串數字了嗎?教程說它叫GUID,其實就是我們要找到IID!熟悉COM編程的人可能一眼就看出來了,但是對於我這種半路出家的門外漢卻是找了半天。接下來我們就可以象這樣使用了:
Dispatch comx = (Dispatch)com.getObject();
Dispatch events = comx.QueryInterface("{00020420-0000-0000-C000-000000000046}");
最後討論一下那對花括弧,一開始我怎麼也弄不明白為什麼要加上花括弧,後來一看註冊表才知道的。大家可以看看自己註冊表中的如下索引值:HKEY_CLASSES_ROOT/JavaScript/CLSID,注意到了嗎?註冊表裡該項的索引值就是帶花括弧的,我估計這就是在使用QueryInterface方法時,參數必須帶花括弧的原因(個人意見,僅供參考)
把這篇文章寫出來是為了和大家分享一下心得,畢竟沒有哪個高手是一天就練成的。同時我也希望瞭解一下大家在使用JACOB中的問題,這也是一個不錯的學習機會。
這裡提供一篇參考文檔,是講關於COM的,我覺的挺不錯的:
http://dev.rdxx.com/VC/VCCOM/2005-7/20/002311305_2.shtml