VBScript 程序员参考手册 读书笔记08-
第8章 VBScript中的類(編寫COM對象)
8.1 對象、類和組件
可以利用一些面向對象的優點。
對象是復雜數據和程序結構在內存中的表現,只有在程序運行時才存在。
類是對象的模板。在設計時就能直接使用的程序設計結構。
類是代碼,而對象是在程序運行時對這段代碼的使用。
組件只是一種打包機制,一種將一個或多個相關類編譯成一個可以部署到一臺或多臺計算機上的二進制文件的方法。組件中可以用于創建對象的類。在Windows操作系統中,組件通常都是一個.DLL或.OCX文件。
人們發現將類打包成獨立于程序的組件更有效率。
?8.2 類語句
通常,您必須將定義VBScript類的代碼與創建類實例的代碼放在一起。但是為了方便代碼的移植和重用,用下面的方法突破這個限制:
·???????將一個或若干個VBScript類打包成Windows組件,在第16章component中會對此做深入探討。
·??????使用ASP的# INCLUDE指示符,將類的定義存放到一個文件中,并在多個ASP頁面中包含它。第20章會探討ASP腳本中的VBScript類。
本章中我們只會探討與使用類的代碼定義在用一個腳本中的類。
8.3 定義屬性
在腳本根據類創建對象時,屬性是存儲和訪問數據的機制。
8.3.1 私有屬性變量
存儲屬性的值的最好方式就是私有屬性變量。這是定義為類級作用域的變量。使用類的代碼通過Property Let、Set和Get過程與其進行交互。對于類作用域的私有變量,必須用Private語句聲明。m前綴是匈牙利命名法中表示模塊級作用域的,也就是類級。
8.3.2 Property Let
Property Let過程是一種特殊的過程,用于在類的外部給私用屬性變量賦值。至少一個參數。Property Let過程類似于VBScript中沒有返回值的子過程。
| Class Customer Private mstrName Public Property Let CustomerName(strName) mstrName = strName End Property End Class |
如果要跳出屬性過程,可以使用Exit Property語句。
8.3.3 Property Get
Property Get過程則是允許類外部的代碼讀取私有屬性變量的值。Property Get有返回值。
| Class Customer Private mstrName Public Property Get CustomerName() CustomerName = mstrName ‘Set CustomerName = mstrName ‘If the private property is the object, use Set End Property End Class |
與VBScript的Function過程類似。如果Property Get過程返回的是一個指向對象變量的引用,就可能需要用Set語句返回這個值。
因為所有的VBScript變量都是Variant變量,所以Set語法并不是不可或缺的。但是還是應該使用Set語法!
8.3.4 Property Set
Property Set過程與Property Let過程很類似,但是Property Set過程是針對基于對象的屬性。當需要在屬性中存放對象(而不是數字、日期、布爾或字符串子類型的變量),就可以提供一個Property Set過程取代Property Let過程。
| Class FileHelper 'Private FileSystemObject object Private mobjFSO Public Property Set FSO(objFSO) Set mobjFSO = objFSO End Property End Class |
?
從功能上來說,Property Let和Property Set過程的功能是一樣的。但是Property Set過程有兩個不同之處:
●明確地說明這個屬性是一個基于對象的屬性(任何使得代碼意義更明確的技術都比其他功能相同的技術更受偏愛)。
●類外部的代碼必須用Set Object.Property= Object才能寫入這個屬性(因為這是實現該功能的典型方法,所以這也是優點)。
8.3.5 創建只讀屬性
有兩種方法可以創建類的只讀屬性:
●只為這個屬性提供Property Get過程。(推薦)
●將Property Get過程聲明為公共的,而將Property Let過程聲明為私有的。(因為類內部的代碼可以直接修改這個私有屬性變量,所以這沒有什么實際意義,并不需要私有的Property Let過程。但即使在這種情況下,類內部的代碼也最好是用Property Let過程,而不是直接修改這個私有屬性變量。)
8.3.6 創建只寫屬性 (與“創建只讀屬性”相反)
8.3.7 沒有屬性過程的公共屬性
還可以為您的類提供沒有Property Let、Get和Set的屬性。這是通過使用公共類級變量實現的。
| Class Customer Public Name End Class |
?
關于這個問題,優秀的程序員也有不同的看法,但是您會發現大多數程序員喜歡用Property Let、Get、Set過程,而不是公共類級變量。
8.4 定義方法
方法(method) 語法跟定義VBScript函數和過程的語法是一樣的。唯一需要額外考慮的就是應該聲明為公共的還是私有的。
類外部的代碼可以調用public(公共)方法,這是公共的;但是不能調用private(私有)方法,因為這是私有的,只能在內部使用。
8.5 類事件 (鉤子程序)
事件(event)是一種會自動被調用的特殊方法。在任何特定的環境中,您所使用的類都支持一個或若干個事件。當給定的環境中支持某個事件時,您可以編寫一個事件處理器(event handler),這實際上就是在事件發生時會自動調用的特殊方法。比如,在瀏覽器中,當用戶單擊按鈕時,頁面中的VBScript代碼可以對這個按鈕的OnClick事件做出響應。
任何VBScript類都自動地支持兩個事件:Class_Initialize和Class_Terminate。
8.5.1 Class_Initialize事件
當有代碼根據類實例化出一個對象時就會引發類中的Class_Initialize事件。類可以沒有,有的話最多一個這個Class_Initialize事件。
比如, 可以在Class_Initialize事件處理器中設置它的初始值,和其他的準備工作,比如打開數據庫連接或打開文件。
語法:處理器的第一行必須是Private SubClass_Initialize,并且最后一行必須是EndSub。
| Private Sub Class_Initialize Set mobjFSO = WScript.CreateObject("Scripting.FileSystemObject") End Sub |
從技術上來說,您可以用Public語句(而不用Private)聲明事件處理器,但是事件處理器通常都是私有的。
8.5.2 Class_Terminate事件
當基于這個類的對象被銷毀時則會觸發Class_Terminate事件。
兩種銷毀對象的方法:
●將特殊值Nothing賦給最后一個引用了該對象的對象變量
●超出了最后一個引用該對象的對象變量的作用域
當對象被銷毀時,其私有的對象變量也會超出其作用域,腳本引擎會自動地將其銷毀。
可以用Class_Terminate事件關閉數據庫連接、關閉文件或是將類的某些信息保存到數據庫或文件中。
8.6 類常量
VBScript不支持聲明類級的具名常量。也就是說,不能在類中使用Const語句聲明供類內部或外部代碼使用的常量。
可以這樣做:類中聲明變量,。然后在Class_Initialize事件處理器中將您希望的“常量”值賦給TEST_CONST變量。全大寫的命名方式提醒類的其他地方不修改這個值。這里創建了一個偽常量。
8.7 構建和使用VBScript類
在設計時,要將類按邏輯分割開,盡量減少類之間不必要的交互。類之間的交互越少越好。應該盡可能地將類設計為一個“黑箱”;可以使用黑箱的功能,可以知道它的輸入輸出,但是無法看到其內部的工作方式。
| ‘創建一個類的實例,即new一個對象 Set objName = New ClassName |
如果用自定義的VBScript類實例化一個對象,使用New;否則,用CreateObject。
?
第9章 正則表達式
BScript并不支持正則表達式常量(就像/a pattern/),而是將文本字符串賦給RegExp對象的Pattern屬性。
| ‘正則表達式示例: Set re = New RegExp re.Pattern = "France" s = "The rain in France falls mainly on the plains." re.Replace(s, "Spain") |
?
?
Global屬性負責設置或返回一個Boolean值,指明模式是匹配整個字符串中所有與之相符的地方還是只匹配第一次出現的地方 。如果Global屬性的值是True,那就會對整個字符串進行查找;否則就不會。默認值是False—— 并不是微軟的某些文檔中說的True 。
IgnoreCase屬性負責設置或返回一個Boolean值,指明模式匹配是否大小寫敏感。默認是False——并不是微軟的某些文檔中說的True 。
Pattern屬性設置或返回用于搜索的正則表達式。
?
Replace方法用于替換在正則表達式搜索中找到的文本。
Test方法對字符串執行正則表達式搜索,并返回一個布爾值說明匹配是否成功。
Execute方法將正則表達式應用到字符串上并返回Matches集合。記住Execute的結果是一個集合,甚至很有可能是一個空集合。可以用ifre.Execute(s).count = 0或專門為這個目的設計的Test方法來測試它。
?
Matches集合的屬性: (只有兩個屬性) 1. Count返回集合中的元素數量;2. Item根據指定的鍵返回元素。
| Set colMatches = re.Execute(s) MsgBox colMatches.count MsgBox colMatches.item(0) |
Match對象:Match對象是Matches集合中的成員。
Match的三個屬性都是只讀的:FirstIndex,Length以及Value。(匹配的位置的索引,匹配字符串的長度, 搜索到的匹配字符串) 。
?
Backreferencing:一個被記住的匹配結果就是模式的一部分。這就是所謂的backreferencing。需要用圓括號指定需要存儲在臨時緩存中的部分。每個捕獲到的匹配結果都會按匹配到的先后次序存放(在正則表達式模式中從左到右)。存放匹配結果的緩存從1開始編號,最大可以到99。可以依次用$1、$2之類的變量訪問它們。
QTP:In addition,the Replace method can replacesubexpressions in pattern.
可以用非捕獲元字符("?:"、"?="或"?!")跳過正則表達式中的某些部分。
示例:
| Dim re, s Set re = New RegExp re.Pattern = "(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)" ??‘圓括號來控制劃分部分。 s = "VBScript is not very cool." MsgBox re.Replace(s, "$1 $4 $2 $5")?????? ‘"VBScript very is cool." 顯示匹配的第1,4,2,5部分。 |
?
?
一些正則表達式的示例:
| ‘分解URI re.Pattern = "(\w+):\ / \ /( [^ /:]+)(:\d*)?( [^ # ]*)" ‘匹配HTML注釋標簽 re.Pattern = "^.*<!--.*-->.*$" ‘匹配空白 re.Pattern = "^[ \t]*$"?????????? ‘空行或是只有空白(空格和制表符)的行 |
?
?
第15章 Windows腳本宿主
這是因為VBScript被設計為一個ActiveX腳本引擎,被用于為ActiveX腳本宿主環境提供腳本運行的功能。
有兩種最普通的宿主:活動服務器網頁(Active Server Pages,ASP); Internet Explorer. 有一定的局限性, ,InternetExplorer不提供腳本與本地計算機(如文件系統、寄存器訪問等)的交互能力.所以需要Windows腳本宿主(Windows ScriptHost,WSH)。WSH完全是一個兼容各種腳本語言的宿主接口,是可以處理各種有ActiveX接口腳本語言(如Jscript)的引擎。
15.1 相關工具:
WSH引擎; (windows系統一般作為組件自帶WSH)
文本編輯器;
如果想使用除VBScript或JScript之外的某種腳本編寫語言,就需要下載相應的ActiveX腳本引擎.
15.2 WSH的概念
WSH是一個Windows管理工具。WSH創建了一個腳本運行的主環境。
15.3 腳本文件的類型
這就是Windows腳本宿主文件(WSF文件)的有用之處。WSF文件可以包含其他的腳本文件作為其腳本的一部分。這意味著多個WSF文件可以引用創建并保存在同一地點的庫和有用的函數。
15.4 使用Windows腳本宿主運行腳本
WSH提供了兩個用于執行腳本的接口,一個用于命令行,一個用于Windows環境。這兩個接口各使用不同的宿主程序作為VBScript引擎:
● cscript.exe:用于在命令行中運行腳本?(cscriptc:\folderName\YourScriptName.vbs)
● wscript.exe:用于在Windows環境中運行腳本?(wscriptc:\folderName\YourScriptName.vbs)
之所以有兩個宿主程序,是因為cscript.exe被設計為從控制臺窗口啟動(一般來說是Windows中的MS-DOS窗口),而wscript.exe則用于直接與Windows GUI進行交互。這兩者就功能來講幾乎沒有區別。
15.5 使用.WSH文件運行腳本
15.6 Windows腳本宿主的內建對象
15.6.1 WScript對象
WScript Object : root object for the Windows Script Hostobject model hierarchy.
provides access to information such as:
·???????command-line arguments,
·???????the name of the script file,
·???????the host file name,
·???????and host version information.
The WScript object allows you to:
·???????create objects,
·???????connect to objects,
·???????disconnect from objects,
·???????sync events,
·???????stop a script's execution programmatically,
·???????output information to the default output device(either a Windows dialog box or the command console).
| ‘不需要創建WScript 對象,系統默認調用WScript.exe |
?
Properties
ArgumentsProperty | BuildVersionProperty | FullNameProperty (WScript Object) | InteractiveProperty | NameProperty | PathProperty | ScriptFullNameProperty | ScriptNameProperty | StdErrProperty | StdInProperty | StdOutProperty | VersionProperty
ArgumentsProperty:object.Arguments (Returns the WshArgumentsobject (a collection of arguments).)
參數從0開始:
| Set objArgs = WScript.Arguments For I = 0 to objArgs.Count - 1 ?? WScript.Echo objArgs(I) Next |
FullName屬性:宿主可執行文件(cscript.exe或wscript.exe)的有效完整路徑。
| Msgbox WScript.FullName |
Name屬性返回WScript對象(宿主可執行文件)的名稱:
| WScript.Echo WScript.Name |
Path屬性返回包含宿主可執行文件(cscript.exe或wscript.exe)的目錄名。
| WScript.Echo WScript.Path |
ScriptFullName屬性返回當前正在運行的腳本的完整路徑。
ScriptName屬性返回當前正在運行的腳本的文件名。
| WScript.Echo WScript. ScriptFullName WScript.Echo WScript.ScriptName |
Interactive屬性設置腳本的模式,或識別腳本的模式。使用該屬性會返回一個布爾值。有兩種可用的模式:批處理模式和交互模式。在交互模式下(默認情況),腳本可以與用戶進行交互。可以向WSH輸入信息,WSH也可以輸出信息,信息被顯示在對話框中,等待用戶提供反饋。在批處理模式中,不支持用戶交互,不支持WSH的輸入和輸出。可以使用WSH命令行開關腳本模式//I(交互模式)和//B(批處理模式)來設置腳本模式。
| WScript.Interactive = false?????? ‘set interactive model WScript.Echo WScript.Interactive??????????? ‘pop up the interactice value |
StdErr屬性開放當前腳本的只寫的錯誤輸出流。該屬性返回一個標識標準錯誤流的對象。只有使用cscript.exe時才能訪問StdIn、StdOut和StdErr流。使用wscript.exe時如果想訪問這些流就會產生一個錯誤。
StdIn屬性開放當前腳本的只讀的輸入流。該屬性返回一個標識標準錯誤流的對象。
StdOut屬性開放當前腳本的只寫的錯誤輸出流。該屬性返回一個標識標準錯誤流的對象。
| Set streamOut = WScript.StdOut Set streamIn = WScript.StdIn Set streamErr = WScript.StdErr Dim strExt, strLineIn Dim intMatch strExt = WScript.Arguments(0) intMatch = 0 ? Do While Not streamIn.AtEndOfStream ??????????? strLineIn = streamIn.ReadLine ??????????? If 0 = StrComp(strExt, Right(strLineIn, Len(strExt)), vbTextCompare) Then ??????????????????????? streamOut.WriteLine strLineIn ??????????????????????? intMatch = intMatch + 1 ??????????? End If Loop |
?
Methods
ConnectObjectMethod | CreateObjectMethod | DisconnectObjectMethod | EchoMethod | GetObjectMethod | QuitMethod | SleepMethod
CreateObject用于創建一個COM對象。
object.CreateObject(strProgID[,strPrefix])
strProgID:值為字符串,表示想要創建的對象的程序標識符(ProgID)。
strPrefix:可選。值為字符串,表示函數前綴。
strPrefix:可選。值為字符串,表示函數前綴。
使用CreateObject方法和strPrefix參數創建的對象是已連接對象。對象被創建后,其輸出接口與腳本文件相連接。每個事件函數都由這個前綴加上事件的名稱來命名。如果創建對象時沒有使用strPrefix參數,也可以使用ConnectObject方法同步對象的事件。
| Set WshNetwork = WScript.CreateObject("WScript.Network") |
?
ConnectObject將對象的事件源連接到具有給定前綴的函數。
object.ConnectObject(strObject,strPrefix)
strObject:必需的。表示想要連接的對象名稱的字符串。
strPrefix:必需的。表示函數前綴的字符串。
| WScript.ConnectObject RemoteScript, "remote_" |
?
DisconnectObject 用于斷開已連接對象的事件源的連接。
object.DisconnectObject(obj)
obj:表示想要斷開連接的對象名稱的字符串。
但是,有一點很重要,那就是斷開連接后對象仍然能夠產生事件。
Echo 法輸出一個消息框或一個命令控制臺窗口。
object.Echo [Arg1] [,Arg2][,Arg3] ...
| WSH引擎 | 文 本 輸 出 |
| Wscript.exe | 圖形消息框 |
| Cscript.exe | 命令控制臺窗口 |
?GetObject: 根據指定的ProgID獲取某個已存在對象,或從文件創建一個新的對象。
object.GetObject(strPathname[,strProgID], [strPrefix])
strPathname:包含將對象保存到磁盤的文件所使用的完整的有效路徑名。
?strProgID:可選。值為字符串,表示想要創建的對象的程序標識符(ProgID)。
?strPrefix:可選。進行對象事件同步時有用。如果提供了strPrefix參數,WSH就會在創建對象之后將對象的輸出接口連接到腳本文件。
| Set MyObject = GetObject("C:\DRAWINGS\SCHEMA.DRW") MyApp = MyObject.Application |
?
Quit強制腳本在任意時刻立即停止執行。
object.Quit([intErrorCode])
ntErrorCode:可選。返回一個整數值,作為進程的返回碼。如果忽略intErrorCode參數,就不會有返回值。Quit方法可以用于返回一個可選的錯誤代碼。如果Quit方法是腳本中的最后一條命令(并且不需要返回一個非零值),就可以不使用任何參數,這樣腳本就會正常退出。
object.Sleep(intTime)
?
15.6.2 WshArguments對象
| Set objArgs = WScript.Arguments |
WshArgument對象的item屬性和count方法:
| Set objArgs = WScript. Arguments For x = 0 to objArgs.Count - 1 WScript.Echo objArgs(x) Next |
?
15.6.3 WshShell對象
可以用于獲取系統環境變量的訪問、創建快捷方式、訪問Windows的特殊文件夾,如Windows Desktop,以及添加或刪除注冊表條目。還可以使用Shell對象的功能創建更多的定制對話框以進行用戶交互。
| Set WshShell= WScript.CreateObject( "WScript.Shell" ) |
WshShell對象有三個屬性:
● CurrentDirectory :該屬性獲取或更改當前活動目錄。
● Environment :該屬性返回WshEnvironment對象(一個環境變量集合)。
object.Environment([strType])
strType:可選。指定環境變量的位置。
Environment屬性包含WshEnvironment對象(一個環境變量集合)。如果指定了strType,就指定了環境變量所在的級別的值:System;User;Volatile;Process。
●SpecialFolders:特殊文件夾的名稱。
?????? WshSpecialFolders對象是一個集合,它包含所有的Windows特殊文件夾,其中包括Desktop文件夾、Start Menu文件夾和Documents/My Documents文件夾
WshShell對象的方法:所有這些方法都與操作系統shell相關,可以用于控制Windows注冊表,也可以創建彈出式消息框和快捷方式以及激活和控制正在運行的應用程序。
AppActivate :這個方法可以用于激活一個指定的已經打開的應用程序窗口。
CreateShortcut:該方法可以用于創建一個新的快捷方式,或打開一個已有的快捷方式。
ExpandEnvironmentStrings:該方法返回環境變量的擴充值。這個方法只對PROCESS環境空間內定義的環境變量進行擴充(增加)。
LogEvent:LogEvent方法向日志文件中添加一個事件條目。
Popup:該方法用于在彈出式消息框中顯示文本。
RegDelete : 該方法從注冊表中刪除一個鍵或其鍵值。
RegRead :該方法返回注冊表中一個鍵或鍵值的名稱。
RegWrtie:該方法可以創建一個新鍵,給現有鍵添加另一個鍵值名(并指定一個值),或修改現有鍵值名的值。
Run :該方法在一個新進程中運行一個程序。
SendKeys : 向活躍窗口發送一次或多次擊鍵(仿佛來自鍵盤)。
Exec: Exec方法在一個子命令解釋器中運行一個應用程序,子命令解釋器提供對StdIn、StdOut和StdErr流的訪問。
15.6.4 WshNamed對象
WshNamed對象提供從命令行中對有名稱參數的訪問。WshArguments對象的Named屬性返回WshNamed對象,這是一個有名稱參數的集合。
15.6.5 WshUnnamed對象
WshUnnamed對象提供了從命令行中對未命名對象的訪問。它是一個由WshAruments對象的Unnamed屬性返回的只讀集合。從該集合中獲取單個參數值時,使用由0開始的索引。
15.6.6 WshNetwork對象
WshNetwork對象提供對計算機所連接的網絡上共享資源的訪問。如果想連接到網絡共享或網絡打印機,從網絡共享或網絡打印機斷開連接,映射或刪除網絡共享,或訪問網絡上某一用戶的信息,都需要創建一個WshNetwork對象。
| Set WshNetwork = WScript.CreateObject("WScript.Network") |
?
15.6.7 WshEnvironment對象
WshEnvironment對象提供對Windows環境變量集合的訪問。
這個對象是一個由WshShell對象的Environment屬性返回的環境變量集合。該集合包含全部的環境變量(包括有名稱的和沒有名稱的)。
要獲取集合中某個具體的環境變量(及其值),可以使用環境變量名作為索引。
| Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSysEnv = WshShell.Environment("SYSTEM") WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS") |
?
15.6.8 WshSpecialFolders對象
WshSpecialFolders對象提供對Windows特殊文件夾集合的訪問。
15.6.9 WshShortcut對象
WshShortcut對象允許您使用腳本創建快捷方式。
15.6.10 WshUrlShortcut對象
WshUrlShortcut對象允許您使用腳本創建到Internet資源的快捷方式。該對象是WshShell對象的子對象。必須使用WshShell方法的CreateShortcut來創建WshUrlShortcut對象。
第16章 Windows腳本組件(Windows Script Component)
16.1 什么是Windows腳本組件
是XML和腳本代碼混合的COM組件,運行在服務器端,執行各種任務。
Windows腳本組件是一種解釋執行的COM組件(之所以要解釋執行,是因為VBScript和所有其他的腳本語言都是解釋執行的)。從結構上講,它們是包含腳本代碼的基于XML的文件。在這些文件中,可以使用VBScript、Jscript、Python、PScript、PERLScript,或其他腳本語言。
腳本組件完全就是COM組件,能夠調用其他的COM組件。
16.2 需要的工具
VBScript 5.0的庫或更高版本;
Internet Explorer 5.0或更高版本;
腳本組件向導(Script ComponentWizard)(可選)::雖然只需要Notepad再加上一定的想象力就可以創建Windows腳本組件,但如果想編寫很多腳本,手工編寫就會變得很乏味。Microsoft提供了腳本組件向導。可以加速腳本組件框架的創建;
腳本組件的文檔副本(可選,但可能比較有用,尤其是如果要處理一些復雜的工作時);
16.3 腳本組件運行時
因為腳本組件在運行時(也就是啟動之后)是解釋執行的,所以在客戶端系統上需要安裝一個解釋器。腳本組件運行時(scrobj.dll)是一個用于控制客戶端與腳本組件之間的調用的解釋器。
腳本調用一個對象(比如Set objMath = CreateObject("Math.WSC"))à在注冊表中的HKEY_CLASSES_ROOT下搜索Math.WSC注冊表項à 獲得COM組件的信息;
?
當調用CreateObject語句時,實際上創建的是scrobj.dll組件。scrobj.dll文件會查看ScriptletURL鍵來確定組件的實際位置。
16.4 腳本組件文件和向導
在windows操作系統(Start|Programs|MicrosoftWindows Script|Windows Script Component Wizard快捷方式)打開腳本組件向導, 一步一步創建組件。
16.5 暴露屬性、方法和事件
要記住,腳本組件可以實現除COM對象以外的組件,因此可以用它創建ADO組件、訪問LDAP(LightweightDirectory Access Protocol,輕量級目錄訪問協議)和Exchange,或調用Microsoft Word或Excel。任何東西都可以用腳本組件來表示。
16.5.1 屬性
腳本組件中的屬性可以是Read/Write、Read-Only或Write-Only。在腳本中,它們是使用<property></property>標記來實現的。在這些標記中,可以為屬性設置get和put選項。get 選項用于讀取數值,put選項用于寫入屬性。
在屬性的get和put函數中可以加入任何額外的控制邏輯。
| <property name="ReadOnlyProperty"> ?????????????? <get/> </property> ?????????????? <property name="WriteOnlyProperty"> ?????????????? <put/> </property> <property name="ReadWriteProperty"> ?????????????? <get/> ?????????????? <put/> </property> |
?
16.5.2 方法
腳本組件中的方法是在腳本文件的對象定義部分使用<method></method>標記定義的。方法的參數使用一個<parameter>定義其值.
默認情況下都是腳本組件中的一個函數,并且沒有指定返回值類型,因為所有的變量都是variant數據類型。但是,可以自由使用子過程作為方法來取代函數。
注意,所有使用Windows腳本組件向導創建的方法都返回“Temporary Value”,需要修改這個返回值.
| <public> <method name="mNoParameters"> </method> <method name="mWithParameters"> <PARAMETER name="var1"/> <PARAMETER name="var2"/> </method> </public> ? ‘實際的方法代碼是在腳本組件的腳本標記中定義的。 <script language="VBScript"> <![CDATA[ Function mWithParameters (var1, var2) ?????????????? Multiply = "Temporary Value" End function ]]> </script> |
?
WSC文檔中沒有介紹在方法的參數聲明中使用byval(傳值)和byref(傳引用)關鍵字。VBScript中,默認情況下所有的值都是以byref方式傳遞的,所以方法中對變量的任何修改都會改變調用函數中該變量的值。 JScript變量都是以byval方式傳遞的,因為JScript不能以byref方式傳遞變量。
?
16.5.3 事件
事件是在腳本文件的對象定義中在<event></event>標記中定義的。
| <script language="VBScript"> <![CDATA[ function mNoParameters() FireEvent("MethodCalled") mNoParameters = "Temporary Value" end function sub MyComponent_MethodCalled() 'some event handling code end sub ]]> </script> |
?
腳本組件還可以在腳本定義中使用一個<implement>標記處理事件。在腳本組件中捕獲事件的語法定義如下:
| <implements type="COMHandlerName" [id="internalName"] [default=fAssumed]> handler-specific information here </implements> |
COMHandlerName是處理程序(ASP或行為)或被處理的COM對象的名稱。
?
16.6 注冊信息
要注冊一個Windows腳本組件,機器上需要有腳本組件運行時(scrobj.dll),和一個合法的腳本組件文件(.wsc),并且要正確注冊。
1.??? 右鍵單擊組件文件, 并在彈出菜單中選擇Register或Unregister來注冊和注銷腳本組件。
2.??? 使用regsvr32.exe命令:regsvr32 path/component_name.wsc
3.??? 也可以在腳本中添加一個注冊條目以定義注冊行為。
Windows腳本組件可以遠程注冊。(這里不討論,需要時再參考)
| ‘腳本里怎樣使用注冊好的組件 set obj = wscript.createobject("math.wsc") obj.method(var1, var2) set obj = nothing |
16.7 創建腳本組件類型庫
要為一個腳本組件生成一個類型庫,只要右鍵單擊腳本組件文件并在彈出菜單中選擇Generate TypeLibrary選項。
?
16.9 ASP的腳本組件
16.10 編譯時錯誤檢查
16.11 在Script組件中使用VBScript類
在XML文件的數據部分中使用<script></script>標記將一個標準的VBScript類集成到一個Windows腳本組件中。
| <script language=‖VBScript‖> <![CDATA[ class <classname> <internal class declaration> end class |
16.11.1 VBScript類的使用限制
腳本組件并不知道內部類的結構信息。要把這個類暴露給外部實體,必須將類信息封裝在方法和屬性中,并聲明在腳本組件文件中。
如果定義了很多類,可以通過源文件包含和提供COM封裝器的方式來定義類。這里要記住的是,VBScript類不能自動地被暴露給COM,所以必須提供某種機制使其他對象能夠訪問類。
16.11.2 使用內部類
和在QTP使用內部類是一致的。
| set oMath = new clsMath |
16.11.3 包含外部源文件
對于COM來說,內部類聲明和外部類聲明是等價的。
示例:把所有的類聲明在math.vbs,再導入進來。
| <script language="VBScript" src="math.vbs"> <![CDATA[ private oMath set oMath = new clsMath |
?
總結
以上是生活随笔為你收集整理的VBScript 程序员参考手册 读书笔记08-的全部內容,希望文章能夠幫你解決所遇到的問題。