在VB編程中采用Windows腳本控件實現程序腳本化
2019-11-18 17:33:41
供稿:網友
電子郵件腳本病毒在網絡上泛濫成災之后,作為腳本缺陷的始作俑者,WSH(Windows腳本主機)受到了廣泛和強烈的抨擊,不過,對應用程序開發人員而言,WSH仍然具備相當大的潛質和開發魅力。是的,腳本技術完全可能取代網絡管理員對批處理文件的依賴,更時髦的腳本相信對那些“真正”的開發人員仍具相當的實用性。
比方說,你知道微軟的Office套件如此流行的原因嗎?其中之一就是所有的Office應用程序都包括了了簡單的開發環境,稍有技術的用戶都可以由此實現重復任務的自動化。VBA(VisualBasicforapplications)就為Office軟件提供了這種環境,而且,如果你能承擔微軟要求的許可證費用,你還可以在你自己的應用程序中使用VBA?,F在,我們再來看看WSH和WindowsScrWord
oCustomers.LoadData"SQLServer","sa",""
'MaketheSEObjectsavailabletoscriptsrunwiththe
'scriptcontrol.
ScriptControl1.AddObject"Customers",oCustomers,True
ScriptControl1.AddObject"Output",oScriptOutput,True
EndSub->
我們還沒有談論過AddObject。該方法把對對象的引用加到腳本控件的執行環境。用這種方式添加的對象可以受到控件所運行的所有腳本的全局訪問,從而令腳本獲得了訪問應用程序所創建的對象的權限。同時這也是一種和應用程序通訊的方式。在這種情況下,我們就為主窗體裝載Customers時創建的數據操作集合添加了引用,同時也對Output類如法炮制,它則給腳本賦予了對主窗體上的txtOutput只寫的訪問權限。
查看EnumCustomer腳本的代碼可以從中了解這種方法的有用性,該腳本代碼請見(清單B)。該腳本獲取單個輸入參數,該參數表示Customers集合內包含的客戶索引,而該集合則是我們通過調用AddObject添加到腳本控件環境的。EnumCustomer腳本訪問Customers集合并枚舉出所選項目的所有可用字段,然后通過Output對象的txtOutput打印出結果。
-width="100">清單B->-width="100">EnumCustomerscript
SubEnumCustomer(num)
Output.PrintLine("ID:"&Customers(num).CustomerId)
Output.PrintLine("CompanyName:"&Customers(num).CompanyName)
Output.PrintLine("ContactName:"&Customers(num).ContactName)
Output.PrintLine("Address:"&Customers(num).Address)
Output.PrintLine("City:"&Customers(num).City)
Output.PrintLine("PostalCode:"&Customers(num).PostalCode)
Output.PrintLine("Country:"&Customers(num).Country)
Output.PrintLine("Phone:"&Customers(num).Phone)
Output.PrintLine("Fax:"&Customers(num).Fax)
EndSub->
有利就有弊
現在你的頭腦里可能產生了這樣一個問題:為什么要把txtOutput封裝在類里而不是經由AddObject為frmMain.txtOutput增加引用呢?UpdateCustomer.vbs的代碼給出了答案:
SubUpdateCustomer(num)
Output.PrintLine("Changing")
Output.PrintLine(Customers(num).ContactName)
Output.PrintLine("toBobHope")
Customers(num).ContactName="BobHope"
EndSub
這個腳本修改了Customers集合中一個項目的內容,意味著腳本對經由AddObject被加到它們環境中的對象進行了讀寫操作。假如我允許有害腳本自由訪問txtOutput的話它不也可以做同樣的事嗎:
txtOutput.Visible=False
當后續運行的腳本試圖經由txtOutput與用戶通訊時,這一行為就會出漏子了。雖然我無法創建成功改變全局對象實際引用的腳本(全局對象是通過AddObject增加的,比如Customers=Nothing),但是我也得承認這種行為也不是不可能的。因此,在訪問腳本的時候就存在一個道德問題了。
用途廣泛
腳本化的應用程序在最終用戶定制和自動化領域具有顯然的巨大作用。比方說,用腳本臨時修補程序等。而且在某些應用程序事件發生的情況下可以運行腳本行使鉤子功能。這樣,你就可以通過簡單地分派腳本糾正應用程序的錯誤而不是分派更新的二進制代碼。定制報告和數據分析也能從中得益。->