1. 程式人生 > >如何使用VB建立伺服器端元件

如何使用VB建立伺服器端元件

   本篇文章通過與傳統的設計方法相比較,介紹瞭如何在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程式碼中接受3個變數的值,並向ASP程式碼返回一個值,該值將
儲存
在名字為strMethodReturn的ASP變數中。下面的程式碼顯示出ASP程式碼是如何得到由VB元件返回的值的,它向VB方法傳送三個名字分別為Param1、Param2和Parma3的三個引數值:
  
  strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
  
  Param1、Param2、Param3這三個引數必須與VB元件中方法的定義完全相同,下面是二行例項化VB元件的類、並呼叫類的方法獲得返回值的ASP程式碼的例子:
  
  Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
  strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
  
  下面的圖表直觀地顯示了VB元件的工程、類和方法名字是如何與ASP檔案中的元件例項化程式碼協調的。在逐步地學習如何編寫例子中的VB程式碼和ASP檔案時,可以將下面的圖表作為參考。
  
 20070404143051768.gif

  VB方法的作用
  
  我們例子中簡單的VB元件將獲得使用者的名字和年齡,然後返回一個以天計的使用者的年齡,而且有一個可選項,能夠提醒某個使用者是否已經超過了45歲。
  
  如果我們向元件傳送一個虛構的Eric Clapton作為方法的第一個引數值,將第二個引數設定為56,我們將得到下面的返回字串:
  
  Eric Clapton is over 20440 days old.
  
  如果我們將可選的第三個引數設定為True(這一引數將使方法判斷使用者是否已經超過45歲),我們將會得到下面的返回字串:
  
  Eric Clapton is over 20440 days OLD.
  
  由於使用了三個完全不同的變數━━使用者的姓名、年齡以及表示他們是否超過了45歲,因此我們需要使用三個方法引數將這些資訊從ASP檔案傳送給VB程式碼。在VB中,考慮要使用哪些資料型別是十分重要的。我們將使用一個名字為strName的字串型變量表示使用者的姓名,名字為intAge的整型變量表示使用者的年齡,名字為blnAgeEmphasisOn的布林型變量表明使用者是否已經超過了45歲。
  
  三個方法引數(傳送給VB元件的方法程式碼的變數):
  
20070404143102980.gif

  在VB中建立伺服器端元件
  
  啟動VB後,在“新工程”視窗中雙擊“ActiveX DLL”圖示。一旦VB載入了新的ActiveX DLL工程,至少會看到二個開啟的視窗:工程視窗和屬性視窗。如果有一個視窗顯示不出來,可以從VB的選單中選擇“檢視”選單項(分別使用“檢視”->“工程管理器”、“檢視”->“屬性視窗”)。
  
  由於VB對第一個工程和類的預設命名分別是Project1、Class1,我們可以將它們分別改為ExampleProject 和ExampleClass。工程名字的修改可以在工程視窗中進行。在工程視窗中新輸入的工程名字左側有一個帶有+或-的小方框。如果顯示的是+號,選擇該小方框,+號就會變成-號,預設的類名(Class1)就會顯示在工程名字的下面。在工程視窗中選擇預設的類名,在屬性視窗中將預設的類名修改為ExampleClass。
  
  在儲存工程時,VB會將包含類的程式碼儲存在一個副檔名為CLS的檔案,工程檔案的副檔名為VBP,其中儲存有工程的各種設定、檔名和檔案儲存的位置。
  
  伺服器端元件的屬性值
  
  在屬性視窗中顯示ExampleClass類的屬性,注意Instancing屬性的值為“5 MultiUse”,如果將工程的型別設定為標準的EXE工程,該屬性的值就會隨之發生改變。
  
  在VB的選單中選擇“工程”->“ExampleProject屬性”,就會顯示出工程屬性視窗。在“常規”標籤的右下端的“執行緒模式”屬性的值應當被設定為“單元執行緒”,這將使多個訪問者能夠同時使用我們的元件類的不同的例項。另外,選擇“無人值守執行”和“駐留記憶體”二個選項,避免VB6中的記憶體洩露問題。
  
  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方法帶有3個從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 String
  
  在VB的程式碼視窗輸入上面的方法定義,就會生成一個End Function語句。方法的定義和End Function之間就是我們編寫自己的程式碼的地方了。