技术文章 > 用VB编写ASP组件

用VB编写ASP组件

2018-09-19 10:45

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:


1.用VB编写ASP组件
2.在VB组件里面添加对数据库的访问
3.函数返回多个值和数组型属性
4.构建处理分页的组件
1.用VB编写ASP组件
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内置对象的连接
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)->右键关闭即可
<返回>

2. 在VB组件里面添加对数据库的访问
设置工程的引用
  选择菜单"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") & "
")
Rs.MoveNext
Wend
Rs.Close
Set Rs = Nothing
End Sub
<返回>
3.函数返回多个值和数组型属性
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)
<返回>
4.构建分页的组件
(1)在ASP用用如下代码引用
<%
Set objForm = server.CreateObject("myUti.PageSearch")
objForm.SetConn(conn) “Conn为数据库连接
objForm.GetSelectOption 10,3,"select * from students","Name","ID" “表Students的key是ID 同时包含一个Name的列
Set objForm=nothing
%>
(2)在VB中按照如上第2步,构造一个可以访问数据库的ActiveX,设工程名为myUti,类名为PageSearch,然后用如下代码覆盖类PageSearch
Private objResponse As Response
Private objRequest As Request
Private conn As ADODB.Connection

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 objResponse = mysc.Response
Set objRequest = mysc.Request

“Exit Function
End Function

Public Function OnEndPage()
“Release Scripting context
Set objResponse = Nothing
Set objRequest = Nothing
Set conn = Nothing
End Function

Public Function SetConn(val As ADODB.Connection)
Set conn = val
End Function

Public Sub GetSearchArray(PageSize As Integer, PagePosition As Integer, SearchSQL As String, ColumnName As String, ColumnKey As String, ArrayName As String)
On Error Resume Next
Dim searchRS As New ADODB.Recordset
Dim i As Integer

searchRS.CursorLocation = adUseServer
searchRS.CursorType = adOpenKeyset
searchRS.LockType = adLockReadOnly
searchRS.Open SearchSQL, conn
searchRS.PageSize = PageSize

If Not searchRS.EOF Then
searchRS.AbsolutePage = PagePosition
objResponse.Write ("")
Else
objResponse.Write ("")
End If

searchRS.Close
Set searchRS = Nothing
End Sub

Public Sub GetSelectOption(PageSize As Integer, PagePosition As Integer, SearchSQL As String, ColumnName As String, ColumnKey As String)
On Error Resume Next
Dim searchRS As New ADODB.Recordset
Dim i As Integer

searchRS.CursorLocation = adUseServer
searchRS.CursorType = adOpenKeyset
searchRS.LockType = adLockReadOnly
searchRS.Open SearchSQL, conn
searchRS.PageSize = PageSize

If Not searchRS.EOF Then
searchRS.AbsolutePage = PagePosition
For i = 1 To PageSize
objResponse.Write ("" & Chr(13))
searchRS.MoveNext
If searchRS.EOF Then Exit For
Next
End If

searchRS.Close
Set searchRS = Nothing
End Sub

Public Sub GetSelectWithNavigate(PageSize As Integer, PagePosition As Integer, SearchSQL As String, ColumnName As String, ColumnKey As String, manageURL As String, selectControlerString As String, CurrentOption As String)
On Error Resume Next
Dim searchRS As New ADODB.Recordset
Dim i As Integer

searchRS.CursorLocation = adUseServer
searchRS.CursorType = adOpenKeyset
searchRS.LockType = adLockReadOnly
searchRS.Open SearchSQL, conn
searchRS.PageSize = PageSize

If selectControlerString = "" Then “ Select Control Begin String
objResponse.Write ("") “ Select Control End String
“Navigate Button
objResponse.Write ("" & Chr(13))
objResponse.Write ("" & Chr(13))
objResponse.Write ("" & PagePosition & "/" & searchRS.PageCount & "")
objResponse.Write ("" & Chr(13))
objResponse.Write ("" & Chr(13))

“Navigate Script
objResponse.Write ("")
searchRS.Close
Set searchRS = Nothing
End Sub