編程|進階 5.2.5 引用物件類型庫
在早先的ASP版本中,在指令碼中使用對象或組件時,組件內定義的公用常數(如果有的話)在ASP裡將不再有效。這意味著我們需要自己聲明它們(或等價物)並指定相應的值。
例如,當在早期版本的ASP中使用ActiveX資料庫物件(ADO)組件時(將在第8章進行詳細的研究),不得不用記錄集的Open方法加入預定義常數聲明。例如:
Const adOpenKeyset = &H0001
Const adLockPessimistic = &H0003
Const adCmdTable = &H0002
…
rs.Open “Contact”,”DSN=GlobalExampleData;UID=examples;Password=;”, _
adOpenKeyset, adLockPessimistic, adCmdTable
…
另一種方法是使用#include指令在頁面插入一個名為adovbs.inc的檔案。該檔案由IIS/ASP提供,包含ADO所需的所有預定義常數。更新代碼時,必須確認使用的是最新版本,並檢查它對於所有的頁面請求都可用。
對於IIS 5.0,有一個更好的方法,通過在HTML注釋元素內使用METADATA指令,可以給組件或對象的類型庫增加引用(IIS 4.0不支援這一功能)。
<!-- METADATA TYPE=”TypeLib”
FILE=”path_and_name_of_file”
UUID=”type_library_uuid”
VERSSION=”major_version_number.minor_version_number”
LCID=”locale_id”
-->
其中:
· path_and_name_of_file是某一類型庫檔案(.tlb)或ActiveX DLL的絕對實體路徑,必須提供這一參數或者是type_library_uuid參數。
· type_library_uuid是該類型庫的唯唯一識別碼,必須提供這一參數或者是path_and_name_of_file參數。
· major_version_number.minor_version_number(可選)定義了所需組件的版本。如果沒有該版本則使用最近的版本。
· locale_id(可選)是地區標誌符。如果在該地區沒有發現類型庫,電腦將使用預設的(安裝時定義的)地區。
因此,使用這一技術,通過使用下面的代碼,能使內建的ADO預定義常數在ASP頁面可用:
<!-- METADATA TYPE=”TypeLib”
FILE=”C:\Program Files\Common Files\System\ado\msado15.dll”
-->
檔案名稱msado15.dll還可用於更高版本(2.50以後)的ADO組件。
如果ASP不能裝載類型庫,就返回一個錯誤並停止該頁的執行。可能的錯誤提示如表5-1所示:
表5-1 錯誤提示代碼及說明
錯 誤 說 明
ASP 0222 無效的類型庫說明
ASP 0223 未找到類型庫
ASP 0224 類型庫不能載入
ASP 0225 類型庫不能打包(即ASP不能從指定的類型庫中建立類型庫封裝對象)
5.2.6 在用戶端上建立對象執行個體
在ASP中討論在伺服器上執行個體化對象和組件的技術時,值得強調的是在瀏覽器中運行用戶端頁面而完成同樣工作的方式。如果你使用ASP建立包含用戶端指令碼程式的頁面,或者使用<OBJECT>元素建立用戶端組件執行個體,將會發現這是非常有用的。在大多數情況下,指令碼運行期對象可在用戶端上執行個體化和使用,效果與伺服器上的ASP相同。
1. VBScript CreateObject方法
在用戶端使用CreateObject時,在瀏覽器的環境內建立組件或對象執行個體,它們與瀏覽器運行在相同的記憶體空間裡(即進程內),除非實現的對象是帶有.exe擴充檔案名稱的可執行檔。
通常指定對象的ClassID,而不是使用ProgID字串,這樣就不可能與其他安裝在用戶端的對象發生衝突。
<SCRIPT LANGUAGE=”VBScript”>
Dim objThis
Set objThis = CreateObject(“clsid:892D6DA7-E0F9-00105A42AF30”)
…
</SCRIPT>
當然也可以使用ProgID,並且使用通用的對象或組件(特別是標準安裝提供的對象或組件),那麼得到錯誤的組件的風險是很小的:
<SCRIPT LANGUAGE=”VBScript”>
Dim objThis
Set objThis = CreateObject(“Scripting.Dictionary”)
…
</SCRIPT>
2. Jscript ActiveXObject方法
為了在用戶端上執行個體化Jscript的對象和組件,必須使用ActiveXObject方法和new操作符:
<SCRIPT LANGUAGE=”JScript”>
var objMyData = new ActiveXObject(‘clsid: 892D6DA7-E0F9-00105A42AF30’);
</SCRIPT>
或:
<SCRIPT LANGUAGE=”JScript”>
var objMyData = new ActiveXObject(‘this.object’);
</SCRIPT>
3. <OBJECT>元素技術
也可使用<OBJECT>元素建立用戶端對象或組件的執行個體。應省略RUNAT屬性或者將其設定為“CLIENT”。然而,這個屬性在用戶端上是被忽略的,因此設定這個屬性的唯一目的就是,在ASP頁面使用<OBJECT>元素執行個體化伺服器端的組件執行個體時防止混淆。
<OBJECT ID=”objThis” RUNAT=”CLIENT”
CLASSID=”clsid: 892D6DA7-E0F9-00105A42AF30”
CODEBASE=”http://yourserver.com/components/mycomponent.cab”>
<PARAM NAME=”param1” VALUE=”value1”>
<PARAM NAME=”param2” VALUE=”value2”>
</OBJECT>
注意,這裡出現的CODEBASE屬性,表示允許下載並安裝來自URL的組件(如果該組件沒有安裝)。IE 3.0以上的版本有此功能。
對於使用<OBJECT>元素的方法、可使用的屬性、在用戶端使用的值,可查看網站http://msdn.Microsoft.com/workshop/author/dhtml/reference/objects/OBJECT.asp,或者Windows 2000 Platform SDK文檔中的<OBJECT> tags,或者看看《IE5 Dynamic HTML Programmer’ Reference》一書,ISBN 1-861001-74-6,Wrox出版社。
5.3 Scripting.Dictionary對象
許多Microsoft的程式設計語言,如Visual Basic、VBScript和Jscript,都提供集合(collection)。可以把集合想象為數組,可以使用其中內建的函數完成儲存和操縱資料等基本任務。無須擔心資料是在哪些行列,而是使用唯一的鍵進行訪問。
VBScript和Jscript都提供類似的對象,通稱Scripting.Dictionary對象或Dictionary對象。它類似於二維數組,把鍵和相關條目的資料存放在一起。然而真正的物件導向的方法,不應直接存取資料條目,必須使用Dictionary對象支援的方法和屬性來實現。
本章提供了一些樣本頁面,允許實驗指令碼運行期對象的方法和屬性。這些執行個體在下載的檔案的檔案的Chaper05子目錄裡。
5.3.1 建立和使用Dictionary對象