用VB寫ASP的組件

用VB寫ASP的組件


1.用VB編寫一般組件

(1)在建立工程時候,ActiveX Dll方式建立工程

(2)添加一個類,會參數如下代碼
Option Explicit

Private Sub Class_Initialize()  '構造函數

End Sub

Private Sub Class_Terminate()  '析構函數

End Sub
(3)添加自己的函數
Function String2Integer(data As String)
   If Len(data) = 1 Then
     String2Integer = "0" & data
   Else
     String2Integer = data
   End If
End Function


<返回>

2.用VB編寫ASP組件(包括Response,Request,Session等內建對象)

Visual Basic工程

  創建組件的步驟是:啓動Visual Basic,在對話框提示時,選擇要創建的工程類型,這裏選擇ActiveX DLL:



設置工程的屬性

  創建工程的名字爲Project1,它包含一個單獨的類模塊叫做class1。這些就足夠了。點擊菜單“Project/Project1 Properties”,在出現的如下所示畫面中設置工程的屬性:



  在General/Tab頁面上有一對需要注意的信息。首先,工程名Project Name已經改變爲ASPToday,這將形成調用名字的第一個部分,這個調用的名字就是被ASP頁面使用的CreateObject的名字。這裏還選擇了Unattended Execution選項,從而禁止了圖形界面的交互(比如錯誤信息對話框),這麼做,有可能導致IIS錯誤。



  在Make頁面唯一發生重要變化的是設置Auto Increment選項,這樣做,當程序編譯後,組件的版本號就會提升。調試程序時,知道組件的版本號是非常有用的,特別是當擁有一個source safe系統時,不過這是另外的話題。



  編譯(Compile)頁面是選擇讓編譯器如何創建組件的地方。在這裏選擇Optimize For Small Code,因爲我要讓Web服務器得到它能得到的最多內存。這個頁面真正重要的選項是DLL基礎地址,這和計算機調入組件相關的代碼庫的方式有關。做爲一個32位的系統,會留下2兆字節的內存裝入代碼。你要設置的基礎地址必須是建立在64K基礎上,用英語方式表達出來就是需要設置類似 &Hxxxx0000 的數值,xxxx表示從1100到7FFF的16進制數字。



在Component頁面,初始的版本兼容性默認是Project compatibility,如果不編譯成第一個版本,這將會是不錯的。當編譯時,爲了有利於註冊表,就應該改變爲Binary Compatibility,如上圖所示。請查閱在線幫助得到關於這個複雜項目的詳細資料。

設置工程的引用

  完成了工程屬性的選擇,下一步就是設置組件運行的ASP環境。通過引用對話框實現這一步。選擇菜單“Project / References”,出現一個對話框,選擇組件需要的庫,在這裏選擇“Microsoft Active Server Pages Object Library”。



  通過上述引用,在程序中就可以訪問ScriptingContext對象,從而能夠使用在ASP頁面中的5個對象:Request, Response, Session, Application 和 Server。

  如果在列表中找不到“Microsoft Active Server Pages Object Library”,點擊“Browse”按鈕定位尋找。ASP庫引用實際上就是一個後綴爲.tlb的文件,默認的路徑應該位於:/Program Files/Microsoft Visual Studio/ Common IDE/IDE98/ASP.TLB。

在組件中命名對象

  在開始編程前,工程的唯一類模塊class1,實在應該含有一個更有意義的名字。在工程瀏覽(Project Explorer)窗口中選擇類項目:



  (如果在編程環境中看不到這個窗口,按“Ctrl+R”組合鍵調出它)在上面的窗口中就可以修改類的名字屬性,接着出現屬性對話框。



  修改名字爲VisitorID。如果看不到這個對話框,按F4顯示它。

編制代碼

  到此爲止,已經爲組件設置了足夠的屬性,建立好了在ASP頁面中調用組件實例的基礎。但是,還需要一個接口方法。下面的圖表顯示了將要建立的接口(用長方形描述對象的方法,用園描述屬性)。



在Visual Basic中,打開類VisitorID的代碼編輯器(在工程瀏覽器中雙擊它的圖標)。

《1》首先建立類的一些變量聲明:
Private mstrError As String
Private ojbSContext As ScriptingContext  '定義了一個ScriptingContext類型的對象變量,ASP處理器根據這個應用傳遞給組件。
Private objResponse As Response
Private objRequest As Request
Private objApplication As Application
Private objServer As Server
Private objSession As Session
Private Const VISITOR_COOKIE = "VID"

Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type


《2》其次定義類的函數:

 (1)首先看看OnStart,用於初始化與ASP內置對象的連接
(Request,Response,Session)

Public Function
OnStartPage(ByVal mysc As ScriptingContext)
Dim strID As String
Dim dtmExpires As Date

'IMPORTANT NEVER Leave a public method without an error handler.
On Error Resume Next

Set ojbSContext = mysc  'ASP處理器檢查Scripting Context,並存儲引用到事先聲明的變量中。
Set objResponse = mysc.Response
Set objRequest = mysc.Request
Set objServer = mysc.Server
Set objApplication = mysc.Application
Set objSession = mysc.Session

'Exit Function
End Function

  (2)OnEndPage方法是放置清理代碼的地方。

Public Function
OnEndPage()
'Release Scripting context
Set ojbSContext = Nothing
Set objResponse = Nothing
Set objRequest = Nothingt
Set objServer = Nothing
Set objApplication = Nothing
Set objSession = Nothing
End Function

  (3)自定義函數GetGUID 

Public Function
GetGUID() As String
 GetGUID = "00000000"
End Function

《3》最後定義屬性

Private mvarResult As String
Public Property Let Result(ByVal vData As String)
   mvarResult = vData
End Property
Public Property Get Result() As String
   Result = mvarResult
End Property

   可以通過對類按右鍵,選擇 Add -> Class Module 可視化地添加函數和屬性

編譯組件和分發組件

  爲了使用新組件,必須將之生成DLL文件。選擇菜單“File/make ASPToday.dll ...”,接着選擇生成組件的路徑。

  組件創建完成後,就要建立一個組件分發軟件包。除了Visual Studio自帶的,有許多第3方工具可以做這件事情,它們都提供了強大的嚮導來幫助建立一個安裝程序,從而在Web服務器上安裝組件。
   
    也可以手動發佈,在命令提示符中輸入 regsvr32 c:/test/fc1.dll
    手動卸載,在命令提示符中輸入       regsvr32 c:/test/fc1.dll /u

在ASP頁面中使用組件

  要實現組件要完成的任務“設置Cookie和到期時間”,需要在頁面主體(Body)送到瀏覽器之前,在HTTP頭部完成GUID的計算。執行下面的代碼將足夠爲瀏覽器設置一個永久的GUID。

< %@ LANGUAGE="VBSCRIPT" % >
< %
Dim oCookieSetter
Set oCookieSetter = Server.CreateObject ("ASPToday.VisitorID")
% >
...

  創建這個獨立組件的簡單對象,足夠可以完成要求的任務。這樣做,就保證了Server.CreateObject方法不僅創建了一個組件的實例,而且將檢查組件的一對方法:OnStartPage()和 OnEndPage(),它們將在適當的時候被執行。這是創建ASP組件、訪問ASP內在對象的關鍵。

如:組件編譯後,又要修改,發生”權限被拒絕,’f:/csdn/fcom.dll’”等等的錯誤。


修改組件時權限問題的解決

  可以使用以下幾種方式來解決
  1. 重新啓動iis.
    在控制面板中找到管理工具->internet信息服務->右鍵點擊左邊樹圖第二層本地計算機->所有任務->重新啓動IIS即可,這個操作需要一點時間。
    此時你可以看到這個dllhost.exe的進程已經關閉
  2. 針對單個網站或者虛擬目錄的重啓
     在控制面板中找到管理工具->internet信息服務->找到你的組件運行的虛擬目錄。->右鍵屬性->第一項虛擬目錄中->應用程序保護->點擊卸載即可。此時你可以看到這個dllhost.exe的進程已經關閉
  3. 如果你覺得麻煩,直接在Windows任務管理器中結束該進程(有時是多個進程)既可。不過要多結束幾次(平均3次可以得手)。
  4. 最後一種方法
     在控制面板中找到管理工具->組件服務->在樹圖中點擊計算機,我的電腦,正在運行的進程->IIS Out-Of-Process Pooled Applications(2860)->右鍵關閉即可

<返回>


3. 在VB組件裏面添加對數據庫的訪問

(1)在WebCVO項目中,可以通過  Private mobjDataAccess As New uti_DataCOM.DataAccess 構建對數據庫的訪問

例如
Private mobjDataAccess As New uti_DataCOM.DataAccess

Dim searchRS As New ADODB.Recordset
Dim str As String

searchRS.CursorLocation = adUseServer
searchRS.CursorType = adOpenKeyset
searchRS.LockType = adLockReadOnly

Set searchRS = mobjDataAccess.SelectSQL(SearchSQL)
searchRS.PageSize = PageSize

If Not searchRS.EOF Then
   str=searchRS("UserName")
End If

searchRS.Close
Set searchRS = Nothing

(2)在其他地方通過如下方法實現

設置工程的引用


  選擇菜單“Project / References”,出現一個對話框,選擇組件需要的庫,在這裏選擇“Microsoft ActiveX Data Objects 2.7 Library”,如果沒有這個版本的,選擇其他版本的ADO library。

創建數據庫對象
 
  這裏的數據庫對象不要用server來創建,而改爲直接創建。或者用參數方式從asp傳入已經建立好的連接。

Public Sub MakeSearchValue(conn As ADODB.Connection)
  Dim Rs As New ADODB.Recordset
  Rs.Open "select top 10 * from tbl_webPri_Privileges", conn, 1
  While Not (Rs.EOF)
    objResponse.Write (Rs("privilegeName") & "<br>")
    Rs.MoveNext
  Wend
  Rs.Close
  Set Rs = Nothing
End Sub

<返回>

4.函數返回多個值和數組型屬性

   Dim a(3)
    
    Public Property Get MyArray() As Variant
     a(0) = 1
     a(1) = 2
     a(2) = 3
     MyArray = a()
    End Property
   調用時爲:
   Dim n As New Class1
    
   Print n.MyArray(1)

<返回>

5.在VB控件中編寫對文件的讀寫

folderName = 臨時文件的目錄
todayString = Year(Now()) & "-" & Month(Now()) & "-" & Day(Now())
     '如果定義了格式化日期的函數用   todayString = Year(Now()) & "-" & String2Integer(Month(Now())) & "-" & String2Integer(Day(Now()))
subFolodName = folderName & "/" & todayString
fileName = subFolodName & "/" & 你的文件名字 & ".html"

Set objFile = CreateObject("Scripting.FileSystemObject")
If objFile.FolderExists(subFolodName) = False Then
   objFile.CreateFolder (subFolodName)
End If

Set TempFile = objFile.CreateTextFile(fileName, True)
TempFile.Write ("hello World")

TempFile.Close

<返回>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章