本篇文章通過與傳統的設計方法相比較
介紹了如何在ASP代碼中調用VB組件的方法
在本篇文章中
我們假設讀者具有VB和ASP的相關入門知識
服務器端組件和客戶端組件的比較
服務器端組件和客戶端組件有許多不同之處
服務器端組件是在計算機服務器上注冊的DLL文件
客戶端組件則在浏覽器運行的計算機上注冊
在IE中
這些客戶端組件被稱作ActiveX浏覽器插件組件
ActiveX客戶端組件可以使用VB編寫
並通過互聯網或內聯網發送給浏覽器
生成很精彩的效果
問題是
ActiveX客戶端組件只限於IE
而使用VB編寫的服務器端組件則能夠產生純HTML代碼
適用於所有的浏覽器
服務器端組件的最大問題是該組件必須在Windows+IIS環境中或與IIS的API兼容的應用中運行
相比較而言
在服務器端實現這種兼容性似乎更容易一些
IIS服務器端組件駐留在與IIS相同的內存空間中
並隨時准備服務器上處理的ASP網頁的調用
從理論上說
我們可以在返回浏覽器的ASP代碼中插入任何文本或代碼
但一般來說
大多數服務器端組件被用來處理需要大量時間的計算或數據庫信息查找
然後將所得到的結果以HTML代碼的形勢返回給浏覽器
VB組件的解析
由於本篇文章旨在討論編寫VB組件的基本方法
因此在能夠說明問題的情況下
其中的例子將是十分簡單的
在詳細討論編寫VB組件之前
我們將首先從概念上對VB組件作一番剖析
在使用VB編寫服務器端的組件時
有三個分層次的概念(在VB和ASP代碼中都會用到)需要注意
·Project名字
·Class名字
·Method名字
VB工程的名字就是Project名字
許多開發人員都將Project名字看作是組件名字
但VB只將它看作是工程的名字
在我們的例子中
Project名字是ExampleProject
當然了
我們可以隨意命名自己的工程名字
Class名字名字是ExampleClass
Method名字是ExampleMethod
工程名字(組件名字)也可以是由組件代碼編譯後得到的DLL文件的名字
該DLL文件將包含有被IIS用來向浏覽器返回文本或HTML代碼的經過編譯的VB代碼
方法名字指的是管理特定代碼功能的VB代碼部分
例如計算日期或顯示數據庫中所有作者的清單
組件方法有點角個黑盒子
它完成特定的工作或根據輸入的信息返回特定的信息
一般情況下
在一個組件中可以有多個方法
為了更有效地管理組件的方法
可以將方法按照相似的分類組合在一起
這就是組件類的作用
組件類能夠在內存中生成組件類代碼的一個拷貝
在使用ASP代碼創建對象時
它也被稱作對象
這就是實例化
一旦有了組件類代碼實例的對象引用
我們就可以從ASP代碼中調用類中包含的方法
在我們的例子中
工程
類
方法的名字將用來在ASP代碼中實例化VB組件
並以方法參數的形式從ASP代碼中向VB代碼傳送值
在ASP代碼中接收從VB方法中返回的值
從ASP文件中調用VB組件
我們用來調用VB組件的ASP文件將使用對象變量保存VB對象的引用
在ASP文件中
可以使用ASP Server對象的CreateObject()方法創建一個對象
該方法將返回一個它創建的對象的引用
在例子中
我們將使用objReference作為組件的對象變量
下面的代碼顯示ASP代碼在實例化VB組件時需要使用組件的工程名和類名(ExampleProject和ExampleClass)
實例化VB組件的ASP代碼
Set objReference = Server
CreateObject(
ExampleProject
ExampleClass
)
VB組件將從ASP代碼中接受
個變量的值
並向ASP代碼返回一個值
該值將存儲在名字為strMethodReturn的ASP變量中
下面的代碼顯示出ASP代碼是如何得到由VB組件返回的值的
它向VB方法傳送三個名字分別為Param
Param
和Parma
的三個參數值
strMethodReturn = objReference
ExampleMethod(Param
Param
Param
)
Param
Param
Param
這三個參數必須與VB組件中方法的定義完全相同
下面是二行實例化VB組件的類
並調用類的方法獲得返回值的ASP代碼的例子
Set objReference = Server
CreateObject(
ExampleProject
ExampleClass
)
strMethodReturn = objReference
ExampleMethod(Param
Param
Param
)
下面的圖表直觀地顯示了VB組件的工程
類和方法名字是如何與ASP文件中的組件實例化代碼協調的
在逐步地學習如何編寫例子中的VB代碼和ASP文件時
可以將下面的圖表作為參考
VB方法的作用
我們例子中簡單的VB組件將獲得用戶的名字和年齡
然後返回一個以天計的用戶的年齡
而且有一個可選項
能夠提醒某個用戶是否已經超過了
歲
如果我們向組件傳送一個虛構的Eric Clapton作為方法的第一個參數值
將第二個參數設置為
我們將得到下面的返回字符串
Eric Clapton is over
days old
如果我們將可選的第三個參數設置為True(這一參數將使方法判斷用戶是否已經超過
歲)
我們將會得到下面的返回字符串
Eric Clapton is over
days OLD
由於使用了三個完全不同的變量━━用戶的姓名
年齡以及表示他們是否超過了
歲
因此我們需要使用三個方法參數將這些信息從ASP文件傳送給VB代碼
在VB中
考慮要使用哪些數據類型是十分重要的
我們將使用一個名字為strName的字符串型變量表示用戶的姓名
名字為intAge的整型變量表示用戶的年齡
名字為blnAgeEmphasisOn的布爾型變量表明用戶是否已經超過了
歲
三個方法參數(傳送給VB組件的方法代碼的變量)
在VB中創建服務器端組件
啟動VB後
在
新工程
窗口中雙擊
ActiveX DLL
圖標
一旦VB加載了新的ActiveX DLL工程
至少會看到二個打開的窗口
工程窗口和屬性窗口
如果有一個窗口顯示不出來
可以從VB的菜單中選擇
查看
菜單項(分別使用
查看
>
工程管理器
查看
>
屬性窗口
)
由於VB對第一個工程和類的缺省命名分別是Project
Class
我們可以將它們分別改為ExampleProject 和ExampleClass
工程名字的修改可以在工程窗口中進行
在工程窗口中新輸入的工程名字左側有一個帶有+或
的小方框
如果顯示的是+號
選擇該小方框
+號就會變成
號
缺省的類名(Class
)就會顯示在工程名字的下面
在工程窗口中選擇缺省的類名
在屬性窗口中將缺省的類名修改為ExampleClass
在保存工程時
VB會將包含類的代碼保存在一個擴展名為CLS的文件
工程文件的擴展名為VBP
其中存儲有工程的各種設置
文件名和文件存儲的位置
服務器端組件的屬性值
在屬性窗口中顯示ExampleClass類的屬性
注意Instancing屬性的值為
MultiUse
如果將工程的類型設置為標准的EXE工程
該屬性的值就會隨之發生改變
在VB的菜單中選擇
工程
>
ExampleProject屬性
就會顯示出工程屬性窗口
在
常規
標簽的右下端的
線程模式
屬性的值應當被設置為
單元線程
這將使多個訪問者能夠同時使用我們的組件類的不同的實例
另外
選擇
無人值守執行
和
駐留內存
二個選項
避免VB
中的內存洩露問題
VB方法的代碼
現在我們就需要使用VB的代碼窗口來輸入VB代碼了
如果代碼窗口還是一片空白
那就輸入下面的代碼好了
Option Explicit
它將要求我們必須定義所有的變量
Public Function ExampleMethod(ByVal strName As String
_
ByVal intAge As Integer
_
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在上面的代碼中
我們將方法定義成了一個Public函數
這意味著該組件之外的任何代碼都能夠調用它
由於是一個函數
它還會向調用它的代碼返回一個值
Public Function ExampleMethod() As String
上面的代碼表示ExampleMethod()函數將向它的調用者返回一個字符串類型的值
我們的VB方法帶有
個從ASP代碼接受值的參數變量
最後一個參數變量是可選的
所有用來從VB組件之外接收值的參數變量都需要在VB方法的括號間定義和使用
我們可以象在方法內定義的變量那樣使用以這種方式定義為方法參數的變量
二者之間唯一的區別是外面的ASP代碼來決定它們的值
下面是三個變量和它們的數據類型
ByVal strName As String
ByVal intAge As Integer
Optional ByVal blnAgeEmphasisOn As Boolean = False
上面的代碼定義了三個方法參數的數據類型
指明它們是按值傳送的
而且第三個參數是可選的
如果沒有第三個參數
則其缺省值為False
然後
我們將在方法的定義中添加一些必要的逗號
空格和底劃線(_)
這樣才能符合VB的語法要求
我們將把參數列表放在方法定義的括號中間
得到的方法定義如下
Public Function ExampleMethod(ByVal strName As String
_
ByVal intAge As Integer
_
Optional ByVal blnAgeEmphasisOn As Boolean = False) As
From:http://tw.wingwit.com/Article/program/net/201311/12678.html