簡(jiǎn)短介紹
COM 是 "Component Object Model"(對(duì)象組件模塊)的縮寫(xiě).是微軟為應(yīng)用程序的相互連接建立的一種公共接口.
這些接口定義為 COM 對(duì)象(Object).
使用 COM 之前, 必須知道程序與它的'接口'是如何精確地執(zhí)行銜接的. 使用 COM,您現(xiàn)在可以“對(duì)話”指定的對(duì)象.
唯一的事情是必須了解這些對(duì)象(Objects)的名稱(chēng)"name"、屬性'properties' 或方法'methods'.
這是對(duì)象(Object)兩個(gè)最基本的特征. 屬性'property'保存對(duì)象包含的數(shù)據(jù).
方法'method'是調(diào)用對(duì)象內(nèi)部函數(shù)完成數(shù)據(jù)處理(執(zhí)行某事件).
視情況而定. AutoIt 有許多內(nèi)建函數(shù)和一個(gè)極大的 UDF 庫(kù). 你可以使用它們做出你編程的大部分.
如果你需要特別的'接口'連接到其它程序, 使用 COM 可以幫助您節(jié)省很多腳本代碼行.
編寫(xiě)腳本必須知道, COM 對(duì)象很大程度上取決于操作系統(tǒng)和已安裝的軟件.
下面的例子已經(jīng)在安裝有 Microsoft Office 2000 的 Windows XP 專(zhuān)業(yè)版上通過(guò)測(cè)試.
要最小化所有打開(kāi)的窗口. 可使用常規(guī) AutoIt 函數(shù),如 WinList 與 WinSetState.
但 COM 的兩行代碼就能得到同樣的效果:
$oShell = ObjCreate("shell.application")
$oShell.MinimizeAll
提示: 此例不是最短的腳本,你可以使用 WinMinimizeAll()函數(shù)最小化所有窗口
第一行, 創(chuàng)建一個(gè)名叫 "shell.application" 的對(duì)象. 這是 Windows 的內(nèi)部對(duì)象, 定義在 shell32.dll 文件中.
新對(duì)象的指針?lè)峙浣o變量 $oShell. 現(xiàn)在 $oShell 就是對(duì)象變量.
第二行, 使用 oShell 調(diào)用 " MinimizeAll" 的方法最小化所有窗口.
所有 Windows 系統(tǒng)都有一個(gè)巨大的內(nèi)部對(duì)象庫(kù)為不同用途簡(jiǎn)化操作.
一些應(yīng)用程序,例如 Excel 或者 Word 同樣也有自己的對(duì)象庫(kù).
有時(shí)要獲得你系統(tǒng)存在的所有對(duì)象的屬性和方法是非常困難的.
搜索 Microsoft.com 或者 Google.com,可以幫助您找到一些關(guān)于您想使用的 Object 的線索.
例如, 可以在這里找到關(guān)于 "shell.application"
對(duì)象的一些信息:
http://msdn.microsoft.com/en-us/library/bb774094.aspx
要查看當(dāng)前安裝在計(jì)算機(jī)系統(tǒng)上面的所有對(duì)象,
"OLE/COM Object Viewer "(OLE/COM 對(duì)象查看器)是一個(gè)相當(dāng)有用的工具
這個(gè)工具將在下面單獨(dú)的章節(jié)中解釋。
再看一個(gè)例子. 如要獲取某個(gè) HTML 網(wǎng)頁(yè)的源代碼. 可以使用內(nèi)置 InetGet() 函數(shù)保存網(wǎng)頁(yè)文件,
再用 FileRead() 來(lái)讀取內(nèi)容. 但以下代碼也能達(dá)到相同的結(jié)果:
$oHTTP =
ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET","http://www.AutoItScript.com")
$oHTTP.Send()
$HTMLSource = $oHTTP.Responsetext
變量 $HTMLSource 現(xiàn)在包含了AutoItScript.com 主頁(yè)完整的 HTML 源代碼(即頂層 HTML 框架).
關(guān)于 "winhttp.winhttprequest"
對(duì)象的相關(guān)信息可以在這里得到:
http://msdn.microsoft.com/en-us/library/aa384106.aspx
)
請(qǐng)記住這一點(diǎn):對(duì)象依賴(lài)于計(jì)算機(jī)的操作系統(tǒng)或者已經(jīng)安裝的程序.
例如: winhttp.winhttprequest.5.1 對(duì)象僅存在于至少安裝有 Explorer version 5 的計(jì)算機(jī)中.
共享腳本使用 COM 對(duì)象, 要確保其它計(jì)算機(jī)上也存在這些 COM 對(duì)象
對(duì)象變量的表現(xiàn)有點(diǎn)不同于其他類(lèi)型的 AutoIt 變量.
對(duì)象不是一個(gè)真實(shí)的值, 而是指向腳本外部某事的一個(gè)'指針'.
因此不能執(zhí)行運(yùn)算, 也不是的等式. 當(dāng)你分配對(duì)象變量不同的值時(shí),'指針'將會(huì)自動(dòng)被釋放.
例如, 給對(duì)象指定任何數(shù)字值或任何文本值強(qiáng)制刪除對(duì)象:
$oHTTP =
ObjCreate("winhttp.winhttprequest.5.1") ; 創(chuàng)建對(duì)象
$oHTTP=0
; 刪除對(duì)象
當(dāng)腳本執(zhí)行完成, 不需要?jiǎng)h除對(duì)象變量.腳本退出時(shí), AutoIt 會(huì)釋放由腳本創(chuàng)建的所有活動(dòng)對(duì)象.
當(dāng)函數(shù)內(nèi)定義一個(gè)局部對(duì)象變量,函數(shù)以返回結(jié)束時(shí),也同樣會(huì)釋放對(duì)象.
一個(gè)非常受歡迎的 COM 應(yīng)用是"自動(dòng)化"程序編制,代替常規(guī)的 Autoit 操作函數(shù),如:Send() 或者 WinActivate().
您可以利用那些程序內(nèi)部定義的對(duì)象. 下面是"自動(dòng)化"操作 Microsoft Excel 的例子:
$oExcel =
ObjCreate("Excel.Application")
; 創(chuàng)建 Excel 對(duì)象
$oExcel.Visible =
1 ;
顯示 Excel
$oExcel.WorkBooks.Add
; 添加新工作表
$oExcel.ActiveWorkBook.ActiveSheet.Cells(1,1).Value="測(cè)試" ; 將 "測(cè)試"
寫(xiě)入第一行、第一列
sleep(4000)
; 等待 4 秒看結(jié)果
$oExcel.ActiveWorkBook.Saved =
1
; 模擬保存工作表
$oExcel.Quit
; 退出 Excel
控制其它程序的復(fù)雜性取決于具體方案, 而不是由 AutoIt 腳本決定.
如果某事件不能如預(yù)期的運(yùn)行,可能需要參考應(yīng)用程序的文檔資料,而不是看 AutoIt 幫助
AutoIt 為 COM 應(yīng)用設(shè)計(jì)了二個(gè)特別的語(yǔ)句:
WITH/ENDWITH 語(yǔ)句與 FOR/IN/NEXT 循環(huán)語(yǔ)句.
WITH/ENDWITH 語(yǔ)句并不增加新的功能,但它能使你的腳本更容易閱讀.
例如上面使用 Excel 的范例還可以寫(xiě)成:
$oExcel =
ObjCreate("Excel.Application") ;
創(chuàng)建 Excel 對(duì)象
WITH $oExcel
.Visible =
1
; 顯示 Excel
.WorkBooks.Add
;
添加新表
.ActiveWorkBook.ActiveSheet.Cells(1,1).Value="測(cè)試" ; 將 "測(cè)試"
寫(xiě)入第一行、第一列
sleep(4000)
; 等待 4 秒看結(jié)果
.ActiveWorkBook.Saved =
1
; 模擬保存工作表
.Quit
; 退出 Excel
ENDWITH
這個(gè)例子沒(méi)有節(jié)省文本行, 但當(dāng)你引用對(duì)象屬性/方法的語(yǔ)句較長(zhǎng)時(shí),你可以用 WITH 語(yǔ)句縮短過(guò)長(zhǎng)的語(yǔ)句行
The FOR...IN 循環(huán)必需使用(Collections)集合.集合(Collections)是一個(gè)特定類(lèi)型的對(duì)象, 它存在多個(gè)子對(duì)象.
您可以把它們看成一個(gè)數(shù)組. (實(shí)際上, FOR..IN 語(yǔ)句也能在數(shù)組類(lèi)型的變量上工作)
下面是演示 FOR..IN 循環(huán)的例子. 使用正常的 AutoIt 數(shù)組, 與 COM 無(wú)關(guān). 只是給你說(shuō)說(shuō)大概原理
$String =
"" ;
一個(gè)為顯示目的字符串
$aArray[0]="a" ;
定義數(shù)組
$aArray[1]=0
; 用幾個(gè)
$aArray[2]=1.3434
; 不同的
$aArray[3]="testestestest" ; 實(shí)例值.
FOR $Element IN $aArray ; 從這里開(kāi)始...
$String = $String & $Element & @CRLF
NEXT
; 顯示用戶(hù)的結(jié)果
Msgbox(0,"For..IN 數(shù)組測(cè)試","結(jié)果: " & @CRLF & $String)
大部份情形下,不能使用'標(biāo)準(zhǔn)'對(duì)象方法取回(collection)集合的元素.
對(duì)于 'COM',必須'枚舉'它們. 這是 FOR..IN 循環(huán)的特點(diǎn).
下面的 Excel 例子在當(dāng)前激活的工作表的 A1:O16 單元格范圍內(nèi)循環(huán)填寫(xiě)數(shù)字.
如果單元格內(nèi)有小于 5 的數(shù)值,將替換為 0 值:
$oExcel = ObjCreate("Excel.Application") ; 創(chuàng)建
Excel 對(duì)象
$oExcel.Visible =
1
; 顯示 Excel
$oExcel.WorkBooks.Add
; 添加新表
dim
$arr[16][16]
; 這些腳本行
for $i = 0 to
15
; 只是創(chuàng)建
for $j = 0 to
15
; 工作表的
$arr[$i][$j]
= $i
; 單元格
next
; 數(shù)據(jù)的示例.
next
$oExcel.activesheet.range("A1:O16").value = $arr ;
將上面的數(shù)字填入工作表的("A1:O16")表格中
sleep(2000)
; 等待 2 秒,然后再繼續(xù)
For $cell in $oExcel.ActiveSheet.Range("A1:O16")
If $cell.Value < 5 Then
$cell.Value = 0
Endif
Next
$oExcel.ActiveWorkBook.Saved = 1 ; 模擬保存工作表
sleep(2000)
; 等待 2 秒,然后再繼續(xù)
$oExcel.Quit
; 退出 Excel
下面這些是使用 AutoItCOM 必須了解的知識(shí)( COM 事件和 COM 錯(cuò)誤處理).
如果你是 COM 程序員新手, 請(qǐng)先閱讀一些關(guān)于 COM 的好文章.
有個(gè)關(guān)于 COM 的經(jīng)典著作叫做 "Inside OLE 2",作者:Kraig Brockschmidt (微軟出版).
您可以在網(wǎng)上找到更多關(guān)于 COM 的資源 (不是與 AutoIt 有關(guān)的):
http://msdn.microsoft.com/en-us/library/ms694363.aspx
http://www.garybeene.com/vb/tut-obj.htm (關(guān)于 Visual Basic 對(duì)象)
http://java.sun.com/docs/books/tutorial/java/concepts/ (在 Java 中使用對(duì)象)
http://msdn.microsoft.com/archive/en-us/dnarguion/html/drgui082399.asp ( C++ 事件對(duì)象)
http://www.garybeene.com/vb/tut-err.htm (Visual Basic 錯(cuò)誤處理)
標(biāo)準(zhǔn) COM 自動(dòng)化主要使用單向通訊.
當(dāng)你訪問(wèn)對(duì)象的屬性或產(chǎn)生的方法時(shí), 只要你的腳本適合它, COM 對(duì)象就能響應(yīng)你的訪問(wèn).
在你需要等候一些 COM 的動(dòng)作發(fā)生時(shí),這就非常便利了.
如果要知道對(duì)象某事件是否已經(jīng)發(fā)生,你可以讓對(duì)象在你的腳本中調(diào)用特定的 UDF, 而不必寫(xiě)一些循環(huán)語(yǔ)句.
同時(shí)你還可以在你的腳本中做其他的事.
不是所有對(duì)象都支持事件. 你必須仔細(xì)閱讀對(duì)象文檔資料確定對(duì)象是否支持事件.
如果支持事件, 則必須知道它支持的事件類(lèi)型. AutoItCOM 只能接收'發(fā)送'類(lèi)型事件.
最后你必須知道對(duì)象產(chǎn)生事件的名稱(chēng),包括他們的自變量(如果有的話).
只有當(dāng)你知道了所有這些信息,你才能開(kāi)始編寫(xiě)使用 COM 事件的 AutoIt 腳本.
下面是一個(gè)接收因特網(wǎng)瀏覽器事件示范腳本中的一段:
$oIE=ObjCreate("InternetExplorer.Application.1") ; 創(chuàng)建
Internet Explorer 對(duì)象
$EventObject=ObjEvent($oIE,"IEEvent_","DWebBrowserEvents") ;
啟動(dòng)接收事件.
$oIE.url= "http://www.autoitscript.com" ; 加載示例網(wǎng)頁(yè)
;從這里開(kāi)始,$oIE 對(duì)象在網(wǎng)頁(yè)加載期間產(chǎn)生事件.
;它們的事件處理在下面顯示的函數(shù)內(nèi).
;在這里寫(xiě)等待用戶(hù)退出腳本的語(yǔ)句.
...(你的代碼在這里)...
$EventObject.stop
; 告訴 IE 要停止接收事件
$EventObject=0
; 消除對(duì)象事件
$oIE.quit
; 退出 IE
$oIE=0
; 移除內(nèi)存中的 IE 信息(不是必需的)
Exit
; 退出主腳本
; 一些 Internet Explorer 的事件函數(shù).
;
; 對(duì)于 IE 事件的完整動(dòng)作列表, 見(jiàn)下面 MSDN 網(wǎng)頁(yè)瀏覽器文檔資料:
; http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.aspx
Func IEEvent_StatusTextChange($Text)
; 在完整腳本中(見(jiàn)下面的鏈接),用一個(gè) GUI 來(lái)顯示內(nèi)容.
GUICtrlSetData ( $GUIEdit, "瀏覽器狀態(tài)更改為: " &
$Text & @CRLF, "添加" )
EndFunc
Func IEEvent_BeforeNavigate($URL, $Flags, $TargetFrameName,
$PostData, $Headers, $Cancel)
; 在完整腳本中(見(jiàn)下面的鏈接),用一個(gè) GUI 來(lái)顯示內(nèi)容.
; 注意: 內(nèi)容與 MSDN 不同.
GUICtrlSetData ( $GUIEdit, "導(dǎo)航: " & $URL & " 標(biāo)記: "
& $Flags & @CRLF, "添加")
EndFunc
點(diǎn)擊這里 查看上例的完整腳本.
這個(gè)腳本的主干是: $EventObject=ObjEvent($oIE,"IEEvent_",...).
這個(gè)函數(shù)需要對(duì)象 $oIE, 并變更從 MYEvent_ 開(kāi)始的 AutoIt
函數(shù)事件名及路徑.
第三個(gè)參數(shù)是可選的. 當(dāng)對(duì)象有多個(gè)事件接口,而且你不想讓 AutoIt 自動(dòng)選擇時(shí), 可以使用第三個(gè)參數(shù).
導(dǎo)致對(duì)象連續(xù)變更路徑的是 $EventObject.這個(gè)變量不需要過(guò)多注意,
除非你想要停止事件.
停止變更路徑事件, 你不能僅僅已類(lèi)似 $EventObject="" 的形式刪除變量.
理由是那 '調(diào)用' 對(duì)象仍然正在占用這個(gè)變量的索引, 而且不會(huì)釋放它,直到對(duì)象本身退出為止.
你可以借由殺死(killing) '調(diào)用'對(duì)象來(lái)解決這個(gè)問(wèn)題,
也可以使用 $EventObject.Stop 告訴對(duì)象你不再需要接收任何事件.
然后你才可以 (也不是真的必需) 通過(guò)分配它一個(gè)任意數(shù)值取消事件, 類(lèi)似: $EventObject=""
如果你知道事件 $oIE 的激活名稱(chēng), 通過(guò)IE名字創(chuàng)建 AutoIt
UDF:Event_Eventname(可選參數(shù))實(shí)現(xiàn)你感興趣的事件.
請(qǐng)務(wù)必確定函數(shù)中自變量的正確數(shù)目,并保證其正確的順序規(guī)定. 否則你可能以料想不到的意外值作為結(jié)束.
如果你不知道 (因?yàn)橐恍├碛? 事件的名字, 你可以增加一個(gè)只有前綴的
UDF,
例如:
Func
IEEvent_($Eventname).
當(dāng)接收事件且沒(méi)有 IEEvent_ Eventname UDF 存在時(shí), 函數(shù)將被調(diào)用代替變量 $Eventname 內(nèi)的事件名稱(chēng).
不一定要執(zhí)行所有事件函數(shù),那些不執(zhí)行的將被忽略
更多使用 COM 事件函數(shù)的例子腳本在 AutoIt 3.1.1.xx beta ZIP 發(fā)布文檔中,
從這里下載: http://www.autoitscript.com/autoit3/files/beta/autoit/COM/
AutoIt 中 COM 事件的限制
一些對(duì)象 (像 'Web 瀏覽器') 將自變量傳遞給他們的事件函數(shù) '作為參照'.
這是為了讓用戶(hù)改變這些函數(shù)中的自變量,并且把它返回到對(duì)象.
然而,AutoIt 使用它自己的變量系統(tǒng),對(duì) COM 變量不是兼容的.
這意謂著所有對(duì)象值將轉(zhuǎn)換成 AutoIt 變量, 因而也失去了參照原有的內(nèi)存空間.
也許在不久的將來(lái),我們可以解決這個(gè)限制 !
使用 COM 沒(méi)有適當(dāng)?shù)腻e(cuò)誤處理是非常棘手的. 尤其是當(dāng)你不熟悉您腳本中的對(duì)象時(shí).
當(dāng)偵測(cè)到一個(gè)COM錯(cuò)誤時(shí),AutoIt 腳本將立即停止執(zhí)行. 這是默認(rèn)設(shè)置,也是最安全的設(shè)置.
在這種情況下,你必須采取措施,以防止錯(cuò)誤在您的腳本中發(fā)生.
如果沒(méi)有方法避免 COM 差錯(cuò), 你可以在腳本中安裝一個(gè)"差錯(cuò)處理程序", 但如果這個(gè)程序被執(zhí)行,表明錯(cuò)誤已經(jīng)發(fā)生.
要使腳本正常工作,這不是一個(gè)完美的解決辦法,也不能捕捉非 COM 相關(guān)的腳本錯(cuò)誤(如申明和語(yǔ)法錯(cuò)誤).
使用 ObjEvent() 和一個(gè)用戶(hù)自定義 COM 事件函數(shù),把差錯(cuò)處理作為 COM 的正常事件是可行的.
唯一的差別是使用一個(gè)固定對(duì)象事件名:" AutoIt.Error". 見(jiàn)示例:
Global $g_eventerror = 0 ; 如果檢查 COM
錯(cuò)誤發(fā)生. 檢查處理后必須復(fù)位.
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; 建立客戶(hù)錯(cuò)誤處理程序
; 這里執(zhí)行一個(gè)預(yù)設(shè)故障(對(duì)象不存在)
$oIE = ObjCreate("InternetExplorer.Application")
$oIE.visible = 1
$oIE.bogus
if $g_eventerror then Msgbox(0,"","前一行有一個(gè)錯(cuò)誤.")
Exit
; 這是我(編者)自定義的錯(cuò)誤處理程序
Func MyErrFunc()
$HexNumber=hex($oMyError.number,8)
Msgbox(0,"","截獲一個(gè) COM 錯(cuò)誤 !" & @CRLF & _
"錯(cuò)誤代碼: " & $HexNumber & @CRLF & _
"錯(cuò)誤描述: " & $oMyError.windescription )
$g_eventerror = 1 ; 函數(shù)返回
Endfunc
有一個(gè)特別有關(guān)錯(cuò)誤事件處理程序的情況, 即它返回的對(duì)象. 這是 AutoIt 錯(cuò)誤對(duì)象,其中包含了一些有用的屬性和方法. 它的執(zhí)行部分是基于VB(腳本)中的“Err”對(duì)象:
AutoIt 錯(cuò)誤對(duì)象的屬性:
.number | 窗口 HRESULT 的值來(lái)自 COM 調(diào)用 |
.windescription | FormatWinError() 錯(cuò)誤文本來(lái)自 .number |
.source | 對(duì)象產(chǎn)生錯(cuò)誤的名稱(chēng) (內(nèi)容來(lái)自 ExcepInfo.source) |
.description | 源對(duì)象錯(cuò)誤描述 (內(nèi)容來(lái)自 ExcepInfo.description) |
.helpfile | 源對(duì)象 helpfile 錯(cuò)誤 (內(nèi)容來(lái)自 ExcepInfo.helpfile) |
.helpcontext | 源對(duì)象 helpfile 環(huán)境 ID 編號(hào) (內(nèi)容來(lái)自 ExcepInfo.helpcontext) |
.lastdllerror | GetLastError() 的返回?cái)?shù) |
.scriptline | 發(fā)生錯(cuò)誤的腳本行 |
AutoIt 錯(cuò)誤對(duì)象的處理方法:
.raise | 引發(fā)錯(cuò)誤的情況下,由用戶(hù)啟動(dòng) |
.clear | 清除錯(cuò)誤對(duì)象的內(nèi)容 (即設(shè)置為 0 值, 字符串設(shè)置為 "") |
編寫(xiě) UDF 程序的一個(gè)注意
在 AutoIt 腳本中, 您最多只能激活一個(gè)錯(cuò)誤事件處理程序. 如果你正在編寫(xiě)包含 COM 函數(shù)的 UDF, 可以檢查用戶(hù)是否安裝有錯(cuò)誤處理程序.
您可以這樣檢查:
$sFuncName = ObjEvent("AutoIt.Error")
if $sFuncName <> "" then Msgbox (0,"提示","用戶(hù)已經(jīng)安裝了錯(cuò)誤處理函數(shù):
" & $sFuncName)
如果沒(méi)有錯(cuò)誤處理程序是激活的,可以暫時(shí)安裝自己的 UDF 調(diào)用.
但是, 在沒(méi)有釋放被指定的變量時(shí),你不能停止現(xiàn)有的錯(cuò)誤處理程序. 如果腳本作者已安裝 COM 錯(cuò)誤處理程序,
他的職責(zé)是使用一個(gè)適當(dāng)?shù)暮瘮?shù)找出由 UDF 產(chǎn)生的 COM 錯(cuò)誤.
"OLE/COM Object Viewer"(OLE/COM 對(duì)象查看器)查看你系統(tǒng)上安裝的所有 COM 對(duì)象時(shí),是一個(gè)非常便利的工具.
它是 Windows 2000 資源套件的一部份,并且能從下面地址免費(fèi)下載: http://www.microsoft.com/downloads/details.aspx?familyid=5233b70d-d9b2-4cb5-aeb6-45664be858b6&displaylang=en
這個(gè)程序的安裝有有點(diǎn)兒尷尬.它不為你產(chǎn)生任何啟動(dòng)菜單圖標(biāo).
執(zhí)行文件 oleview.exe 安裝在 C:\Program Files\Resource 套件目錄中.(默認(rèn)安裝).
當(dāng)運(yùn)行 oleview.exe 時(shí),一些系統(tǒng)將會(huì)提示找不到 iviewers.dll 文件. 這是個(gè)必須的文件,
奇怪的是不包含在最新安裝之中.你可以從下面地址獲得一個(gè) oleview.exe 較舊版本: http://download.microsoft.com/download/2/f/1/2f15a59b-6cd7-467b-8ff2-f162c3932235/ovi386.exe.
它將默認(rèn)安裝到 C:\MSTOOLS\BIN 目錄.你只需將文件 iviewer.dll 復(fù)制到 oleview.exe 所在目錄,
然后使用命令行注冊(cè)DLL: regsvr32 iviewers.dll.
中文版 autoit3 將 oleview.exe 文件安裝在:E:\autoit3\Extras\OLEview 文件夾中(默認(rèn)安裝),同時(shí)已存在必須的 iviewers.dll 文件.
讓我們用 Oleviewer 做一個(gè)例子. 運(yùn)行 oleview.exe 依次展開(kāi):
Object Classes->Grouped by Component Category->Control->Microsoft Web Browser.
在左側(cè)欄中你可以看到為對(duì)象定義的所有 COM 接口. 我們稍后討論這些.
仔細(xì)看看右欄. 它包含在 AutoIt 腳本中使用這個(gè)對(duì)象的許多信息. 最重要的是 "VersionIndependentProgID".
這是一個(gè)在 ObjCreate, ObjGet 或 ObjEvent 函數(shù)中使用的名字. 此外它還包含對(duì)象的目錄和文件名. 這可能是 EXE, DLL 或 OCX 文件.
InProcServer32 意味著您的腳本與對(duì)象運(yùn)行在同一線程(進(jìn)程).
當(dāng)您見(jiàn)到 LocalServer32, 表示對(duì)象作為單獨(dú)的進(jìn)程運(yùn)行. 該對(duì)象還必須包含一個(gè)類(lèi)型庫(kù) ("TypeLib=" 之后的行), 否則無(wú)法使用在 AutoIt 腳本中.
左側(cè)列中的接口用于與對(duì)象交互的不同方法. 有些用來(lái)做儲(chǔ)存 (IStorage, IPersist), 其它的嵌入 GUI (IOleObject, IOleControl).
AutoIt 使用 IDispatch 作為自動(dòng)化接口. 這個(gè)接口'暴露' 該對(duì)象支持腳本的全部方法和屬性.
如果它不存在,則無(wú)法在一個(gè) AutoIt 腳本中使用對(duì)象.
讓我們來(lái)看看在這個(gè)界面. 右鍵單擊 IDispatch 名稱(chēng)并在右鍵菜單選擇 "View...". 然后單擊"View TypeInfo..." 按鈕.
(注意: 如果這個(gè)按鈕是灰色的,表示你沒(méi)有注冊(cè) iviewers.dll 文件,或?qū)ο鬀](méi)有這個(gè)類(lèi)型庫(kù))
"ITypeInfo Viewer" 窗口僅顯示該對(duì)象提供的信息. 如果開(kāi)發(fā)者沒(méi)有包括幫助文件,你只能看到方法/屬性的名稱(chēng)而沒(méi)有其他信息.
"Microsoft Web Browser" 類(lèi)型庫(kù)內(nèi)容相當(dāng)廣泛. 在左邊列中點(diǎn)擊一個(gè)項(xiàng)目,該項(xiàng)目的描述將會(huì)在右邊顯示.
有時(shí)你必須瀏覽 "Inherited Interfaces" 為對(duì)象檢索更多的方法.
描述方法/屬性的語(yǔ)法是 C/C++ 樣式.
屬性描述為 "HRESULT Resizable([in] VARIANT_BOOL pbOffline)", 必須在 AutoIt 重寫(xiě)為: $Resizable=$Object.Resizable
($Object 保存對(duì)象創(chuàng)建的 ObjCreate 或 ObjGet).
以下這些術(shù)語(yǔ)通常與 COM 一起混和使用, 但是有不同的意義:
OOP = 面向?qū)ο缶幊? 把可重復(fù)使用的軟件組件構(gòu)建成模塊并稱(chēng)為對(duì)象.
DDE = 動(dòng)態(tài)數(shù)據(jù)交換. 可以說(shuō)這是 COM 的前身. 在不同的應(yīng)用程序之間使用 IPC 傳遞命令信息.
OLE = 對(duì)象鏈接和嵌入. 第一個(gè)版本是 DDE 的擴(kuò)充版本. 從一個(gè)程序 '嵌套' 數(shù)據(jù)到另外一個(gè)程序. 目前的 OLE 建立在 COM 之上,并且成為 ActiveX 的一部分
Automation = 操作另一個(gè)應(yīng)用程序?qū)ο蟮姆椒? 用在 OLE, ActiveX 與 COM 中.
ActiveX = OLE 的下一代自動(dòng)操作裝置, 起先主要用于開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用之間的接口(尤其是 web 瀏覽器). 建立在 COM 之上.
DCOM= 分布式 COM. 一個(gè)略有修改的 COM, 它能夠溝通不同的物理計(jì)算機(jī).
.NET (dot Net)= 不是一個(gè)真正的軟件, 但微軟的 '概念' 認(rèn)為,這是互連網(wǎng)“一切動(dòng)作”通過(guò)的軟件. "dot Net" 主要用于網(wǎng)絡(luò)服務(wù).
COMmunist = 這個(gè)不支持 COM, 但有什么人信奉 communism (一種理論認(rèn)為,普通老百姓應(yīng)該擁有自己所有的財(cái)產(chǎn)). ( 譯注:此處牛頭不對(duì)馬嘴!或是幽默,或是尋開(kāi)心....總之不知為何?最后那個(gè)詞就不翻譯了!).
provider with jb51.net (unicode) |