使用VB将ASP代码封装生成DLL文件
一、引言
Server端的脚本运行环境,它简单易用,不需要编译和连接,脚本可以在 Server端直接运行,并且它支持多用户、多线程,在 Web开发中得到了广泛的应用。服务器端的组件有别于客户端的组件。客户端的组件是通过网络传输,依靠HTML来起作用,而且只能在IE上有用。但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作。因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器。但是,因为 ASP脚本是纯文本格式,所以恶意者通过源代码可以很容易地看到原本不该看到的页面内容。因此,保护ASP源代码显得非常重要。将ASP代码封装成DLL,不仅加快了ASP代码的执行速度,而且也能保护原代码。当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到标签之间的代码,并且执行它(也可以是之间的代码)。如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译。这样就大大节省了服务器的资源。
二、实现方法
启动你的VB,选择ActiveX图标。这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1)。在动手之前请首先确认我们拥有Microsoft ActiveX Data Object 2。0 Library,它在我们的程序非常有用。从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口,从中选择Microsoft ActiveX Data Object 2。0 Library。
现在我们有了我们自己的工程(project1)和类名(class1)。以后我们就会在ASP代码中使用它们的名字来引用这个组件。在ASP中我们就这样引用,如下:
Set ObjReference = Server。CreateObject("ProjectName。ClassName")
为了在类中使用ASP的方法,你必须在此类中写上初始和终止这两个函数。输入如下代码:程序清单中
Class1。cls中的Private Sub Class_Initialize()和Private Sub Class_Terminate()
将ASP代码中的关键功能制作成动态链接库(。dll),部分隐藏 ASP源代码。 例如:程序清单中的Global。bas和Class1。cls中输入的代码(代码的主要功能是检索数据库中的记录并显示出来)。
在VB的下拉菜单中选择文件→生成article。dll→选择要保存的目录。找到article。dll将其复制到系统盘system32文件夹中,最后一步注册DLL文件。在开始菜单中选择运行输入regsvr32 c:“winnt“system32“article。dll。
三、程序清单
Global。bas中的代码:
以下是引用片段:
Public objContext As ObjectContext
Public Application As ASPTypeLibrary。Application
Public Server As ASPTypeLibrary。Server
Public Session As ASPTypeLibrary。Session
Public Response As ASPTypeLibrary。Response
Public Request As ASPTypeLibrary。Request
Class1。cls中的代码:
Private Sub Class_Initialize()
On Error Resume Next
Set objContext = GetObjectContext
Set Application = objContext。Item("Application")
Set Server = objContext。Item("Server")
Set Session = objContext。Item("Session")
Set Request = objContext。Item("Request")
Set Response = objContext。Item("Response")
End Sub
Private Sub Class_Terminate()
On Error Resume Next
Set Application = Nothing
Set Server = Nothing
Set Session = Nothing
Set Request = Nothing
Set Response = Nothing
Set objContext = Nothing
End Sub
Public Sub AspClassInit()
On Error GoTo Err
Set conn = Server。CreateObject("ADODB。Connection")
strcon = "Provider=Microsoft。Jet。OLEDB。4。0;" %26amp; _
"Data Source=" %26amp; Server。MapPath("Article。mdb")
conn。Open strcon
Set rs = Server。CreateObject("ADODB。Recordset")
sql = "select from Article order by ArticleID desc"
rs。Open sql, conn, 1, 1
Response。Write "%26lt;html%26gt;" %26amp; vbCrLf
Response。Write "%26lt;head%26gt;" %26amp; vbCrLf
Response。Write "%26lt;meta http-equiv=""Content-Type"" content=""text/html; charset=gb2312""%26gt;" %26amp; vbCrLf
Response。Write "%26lt;title%26gt;文章管理系统-CSSTUDIO%26lt;/title%26gt;" %26amp; vbCrLf
Response。Write "%26lt;/head%26gt;" %26amp; vbCrLf
Response。Write "%26lt;body bgcolor=""#FFFFFF"" topmargin=""0""%26gt;" %26amp; vbCrLf
Response。Write "%26lt;table width=""100%"" border=""0"" cellpadding=""2"" cellspacing=""0""%26gt;" %26amp; vbCrLf
Response。Write " %26lt;tr%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""742"" height=""20""%26gt;文章标题%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""90""%26gt;点击%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""145""%26gt;添加日期%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;/tr%26gt;" %26amp; vbCrLf
Response。Write "%26lt;/table%26gt;" %26amp; vbCrLf
While Not rs。EOF And Rows %26lt; rs。PageSize
Response。Write "%26lt;table width=""100%"" border=""0"" cellspacing=""0"" cellpadding=""0""%26gt;" %26amp; vbCrLf
Response。Write " %26lt;tr%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""747"" height=""20""%26gt;☆%26lt;a href=""view。asp?id="
Response。Write rs("ArticleID")
Response。Write """%26gt;" %26amp; vbCrLf
Response。Write " "
Response。Write rs("标题")
Response。Write "%26lt;/a%26gt;%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""94""%26gt;"
Response。Write rs("点击")
Response。Write "%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;td width=""148""%26gt;"
Response。Write rs("添加日期")
Response。Write "%26lt;/td%26gt;" %26amp; vbCrLf
Response。Write " %26lt;/tr%26gt;" %26amp; vbCrLf
Response。Write "%26lt;/table%26gt;" %26amp; vbCrLf
rs。MoveNext
Wend
Response。Write "%26lt;/body%26gt;" %26amp; vbCrLf
Response。Write "%26lt;/html%26gt;" %26amp; vbCrLf
rs。Close
Set rs = Nothing
conn。Close
Set conn = Nothing
Exit Sub
Err:
If Err。Number = -13572468 Then Exit Sub
Resume Next
End Sub
使用article。dll后的index。asp中的代码: 以下是引用片段:
%26lt;%Dim AspTransBuilderObject
Set AspTransBuilderObject = Server。CreateObject("article。Class1")
AspTransBuilderObject。AspClassInit
Set AspTransBuilderObject = Nothing%%26gt;
使用article。dll前的index。asp中的代码:
以下是引用片段:
%26lt;% Set conn=Server。CreateObject("ADODB。Connection")
strcon = "Provider=Microsoft。Jet。OLEDB。4。0;" %26amp; _
"Data Source=" %26amp; Server。MapPath("Article。mdb")
conn。Open strcon %%26gt;
%26lt;% Set rs = Server。CreateObject ("ADODB。Recordset")
sql="select from Article order by ArticleID desc"
rs。Open sql, Conn,1,1 %%26gt;
%26lt;html%26gt;
%26lt;head%26gt;
%26lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"%26gt;
%26lt;title%26gt;文章管理系统-CSSTUDIO%26lt;/title%26gt;
%26lt;/head%26gt;
%26lt;body bgcolor="#FFFFFF" topmargin="0"%26gt;
%26lt;table width="100%" border="0" cellpadding="2"
cellspacing="0"%26gt;
%26lt;tr%26gt;
%26lt;td width="742" height="20"%26gt;文章标题%26lt;/td%26gt;
%26lt;td width="90"%26gt;点击%26lt;/td%26gt;
%26lt;td width="145"%26gt;添加日期%26lt;/td%26gt;
%26lt;/tr%26gt;
%26lt;/table%26gt;
%26lt;% While Not Rs。Eof And Rows%26lt;Rs。PageSize %%26gt;
%26lt;table width="100%" border="0" cellspacing="0"
cellpadding="0"%26gt;
%26lt;tr%26gt;
%26lt;td width="747" height="20"%26gt;☆%26lt;a href="view。asp?id=%26lt;%
= rs("ArticleID") %%26gt;"%26gt;
%26lt;% =rs("标题") %%26gt;%26lt;/a%26gt;%26lt;/td%26gt;
%26lt;td width="94"%26gt;%26lt;% = rs("点击") %%26gt;%26lt;/td%26gt;
%26lt;td width="148"%26gt;%26lt;% = rs("添加日期") %%26gt;%26lt;/td%26gt;
%26lt;/tr%26gt;
%26lt;/table%26gt;
%26lt;% Rs。MoveNext
Wend %%26gt;
%26lt;/body%26gt;
%26lt;/html%26gt;
%26lt;% rs。close
set rs=nothing
conn。close
set conn=nothing %%26gt;
四、结论
因为这些代码是在服务器端运行的,所以客户端不需要安装任何东西。这仅仅是用ActiveX DLL所能实现的功能的小小的例子。你们可以写好自己的更大的组件,而且还可以用VB中的很多控件。让我们用组件来扩展我们的程序的功能吧!也希望多多的看到我们中国人的组件。但愿本文能起到抛砖引玉的作用。