编译(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)窗口中选择类项目:
在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服务器上安装组件。
这里的数据库对象不要用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
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
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