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