封裝為dll會帶來很多的好處,主要包括只是產權的保護,以及效率和安全性能的提升。這個例子中被封裝的dll文件可以隱藏access數據庫的實際路徑。
VB生成的DLL封裝ASP代碼來連接數據庫(Access)。
本文用一個最簡單的連接access數據庫的例子來說明如何將asp代碼封裝為dll文件。
我們用vb,最常見的方式來封裝asp代碼。
我們需要封裝的對象如下:
'Proconn.asp
dim ProConn
set ProConn=Server.CreateObject("ADODB.CONNECTION")
ProConn.Open "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")
我們將下面的部分封裝
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")
分析一下這段要封裝的內容,
它的前半部分就是一個字符串:
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
用&連接上后半部分的另一個字符串。
后半部分的另一個字符串是Server.MapPath對象函數的返回值。
下面開始這個封裝的操作過程。
首先
新建一個VB下的ActiveX DLL工程,工程的名稱Project1更改成ConDBDLL
方法class1的名稱更改成cs
工程名和方法名會在調用這個DLL的時候使用到,大家可以按照自己命名規則定義,但請注意好好使用。
這個DLL的代碼部分書寫如下:
Dim rp As Response
Dim rq As Request
Dim ap As Application
Dim sr As Server
Dim sn As Session
Public Sub OnStartPage(MyScriptingContext As ScriptingContext)
Set rp = MyScriptingContext.Response
Set rq = MyScriptingContext.Request
Set sr = MyScriptingContext.Server
Set ap = MyScriptingContext.Application
Set sn = MyScriptingContext.Session
End Sub
Public Sub OnEndPage()
Set rp = Nothing
Set rq = Nothing
Set sr = Nothing
Set ap = Nothing
Set sn = Nothing
End Sub
'以上語句是必須的,將原本的對象作了簡化處理,并在兩個基本函數中作了處理
Public Function ConnectDB() As Variant
ConnectDB = "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
End Function
'上面這個函數是處理前半部分字符串的,直接返回這個字符串的內容
'另外定義下面這個函數來處理后半部分內容
Public Function DBPath() As Variant
DBPath = sr.MapPath("DB.asp")
End Function
'注意上面使用的是sr,不要使用成Server了
到了關鍵的一步,給這個工程添加"Microsoft Active Server Pages ObjectContext Object Library" 的 Reference
添加方法,選擇菜單中的"Project"->"Reference",在打開的對話框里選擇。
對了,還要選擇上"microsoft activeX data objects 2.6 library"
進行完以上操作,我們就可以編譯生成DLL了,(別忘了前面的改工程名和方法名)
準備好數據庫文件DB.asp (由DB.mdb更改后綴而成,密碼123)
下面就是調用封裝的連接數據庫的asp文件代碼:
由于是自己創建的DLL,把它拷貝到相應的目錄后,必須注冊才能使用。
注冊的方法,在“運行”中執行:
Regsvr32.exe dllname.dll
取消這個DLL的注冊的方法是:Regsvr32.exe /u dllname.dll
注冊完畢,我們的工作基本上就做完了,現在我們可以使用這樣的封裝方法連接具有針對性的數據庫了。
不過有一點需要特別注意的是:
由于
Dim ConDB
set ConDB=Server.CreateObject("ConDBDLL.Conn")
'ConDB就是創建的DLL對象
這是在ASP中創建的對象,包括ProConn,那么我們在任何使用到(引用)ProConn.asp的其他ASP文件中記得釋放這兩個對象!
ProConn.close
set ProConn=nothing
set ConDB=Nothing
否則系統會由于對象沒有釋放,而變得越來越不堪重負。
關于這個封裝ASP代碼連接Access數據庫的方法,我想完全適用其他數據庫的連接方法。
再例如,下面的封裝的例子:
首先要申明變量:
Private WenScriptingContext As ScriptingContext
Private WenApplication As Application
Private WenRequest As Request
Private WenResponse As Response
Private WenServer As Server
Private WenSession As Session
為了在WenConnection類中使用ASP的內建對象,必須在此類中寫一個OnStartPage子函數。那是因為無論什么時候用戶訪問一個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用。這個ScriptingContext包括了全部的ASP方法和屬性,這使得我們有能力訪問所有ASP的對象。
Public Sub OnStartPage (PassedScriptingContext As ScriptingContext)
Set WenScriptingContext = PassedScriptingContext
Set WenApplication = WenScriptingContext.Application
Set WenRequest = WenScriptingContext.Request
Set WenResponse = WenScriptingContext.Response
Set WenServer = WenScriptingContext.Server
Set WenSession = WenScriptingContext.Session
End Sub
我們既然用OnStartPage函數來創建對象,那么我們這里就用OnEndPage子函數來釋放對象:
Public Sub OnEndPage()
Set WenScriptingContext = Nothing
Set WenApplication = Nothing
Set WenRequest = Nothing
Set WenResponse = Nothing
Set WenServer = Nothing
Set WenSession = Nothing
End Sub
接下來定義兩個函數RsResult()和DataSource():
Public Function Rs(strsql As String) As Recordset
Dim oConn As Connection
Dim oRs As Recordset
Dim strconnstring As String
strconnstring = "driver={sql server};server=ServerName;uid=sa;pwd=;" & _
"database=DataBaseName"
oConn.Open strconnstring
oRs.ActiveConnection = oConn
strsql="Select * From tableName"
oRs.Open strsql, oConn, 1, 3
Set Rs = oRs
End Function
Public Function DataSourceConnection() As Variant
DataSourceConnection = "driver={sql server};server=ServerName;uid=sa;pwd=;database=DataBaseName"
End Function
三、 存工程名為WenADODB.vbp和保存類名為WenConnection.cls,然后點擊“文件”—>“生成WenADODB.DLL”編譯成動態連接庫文件。VB在編譯好動態連接庫文件的同時也將該組件注冊到注冊表里了,要是想在另外一臺機器上注冊該組件的話,請用以下指令注冊或反注冊:
Regsvr32 x:\路徑\WenADODB.dll x:\路徑\為WenADODB.dll文件存放的盤符和路徑
Regsvr32 /u x:\路徑\WenADODB.dll 參數U為反注冊
四、 在ASP文件中調用WenADODB.dll組件的例子。
<%
Set Conn=Server.CreateObject("WenADODB.WenConnection") ‘調用組件創建對象實例
objConn=Conn.DataSourceConnection()
application("strconn")=objConn
set Rs=Server.CreateObject("ADODB.Recordset")
sql="select * from TableName order by ID DESC"
Rs.open sql,application("strconn"),1,3
%>
<Table align="center" border="1">
<%
if Rs.Bof and Rs.Eof then
Response.Write "暫時還沒有任何數據。"
else
Do while not Rs.Eof
%>
<tr width=100%>
<td width=50%><%=Rs("Field1")%></td><td width=50%><%=Rs("Field2")%></td>
</tr>
<%
Rs.MoveNext
Loop
end if
Rs.Close;Set Rs=Nothing
%>
</Table>
五、 小結
我們這里只是編寫了一個連接數據庫的簡單的動態連接庫文件,利用VB的強大組件編寫功能還可以寫出功能更加強大跟齊全的組件,來完成更加實用的任務
關鍵字 如何把ASP編寫成DLL
這篇文章主要是把ASP代碼變成組件,開發者不僅是加快了ASP的速度,而且也能保護自己的代碼.
下面,我們會來編寫一個非常簡單的組件,重點是知道怎樣開發DLL組件,而不是其復雜的代碼!這些都要靠你們自己以后的努力了.
服務器端組件
首先,服務器端的組件要有別于客戶端的組件.客戶端的組件是通過網絡傳輸,依靠HTML來起作用.而且只能在IE上有用.但是服務器端的組件是運行在服務器端,它在服務器上執行各種操作.因此,所有的瀏覽器都能享用,它依靠的是服務器而不是瀏覽器.
當IIS被請求執行一個ASP程序,它首先會在ASP文件中找到〈%%>標簽之間的代碼,并且執行它(也可以是〈scriptrunat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那么它就會用內存中的編譯過的程序來向用戶返回HTML代碼,如果沒有,那么它就重新編譯.這里ASP就比CGI多一點速度優勢,因為CGI是每一個請求都使用一個線程.這樣就大大消耗了服務器的資源.
想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立DynamicLinkedLibraries(DLL文件),它能在IIS上直接運行(如果有asp文件來請求的話).
系統和軟件的要求
你需要一個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我們下面的程序是在windows95+PWS+VB5的環境下開發的.
我們開始吧
啟動你的VB,選擇ActiveX圖標.這個圖標可以在新建工程找到!VB會提供一個默認的工程名(project1)和類名(class1).我們會將這兩個名字都改掉.在改名之前,請首先確認我們擁有MicrosoftActiveServerPagesObjectLibrary,它在我們的程序非常有用.從菜單中選擇"工程",然后在其中選擇"引用",就會出現"引用"窗口
從中選擇MicrosoftActiveServerPagesObjectLibrary.
給工程和類命名
現在我們來根據自己的愛好來為project1和class1來命名吧!給它們命名也是很重要的,我們以后會用這個工程名和類名來創建這個組件的實例!后面詳細介紹.
如何改名,我就不想多說了!
我們的工程名改為Exmaple,類名為Helloword
怎樣使用工程和類
現在我們有了我們自己的工程(Example1)和類名(HelloWorld).以后我們就會在ASP代碼中使用它們的名字來引用這個組件.在ASP中我們就這樣引用,如下:
SetObjReference=Server.CreateObject("ProjectName.ClassName")
對于我們工程的引用就是:
SetObjReference=Server.CreateObject("Example1.HelloWorld")
現在我們就能用ObjReference來調用我們在組件中所創建的函數,子程序.下面我們會來寫一個SayHello的子程序,我們執行它的代碼如下:
〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
為了在Helloword類中使用ASP的方法,你必須在此類中寫一個OnStartPage
子函數.如下:
PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
SetMyScriptingContext=PassedScriptingContext
EndSub
現在,無論什么時候用戶訪問一個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我們有能力訪問所有ASP的對象.看下面的代碼:
PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
SetMyScriptingContext=PassedScriptingContext
SetMyApplication=MyScriptingContext.Application
SetMyRequest=MyScriptingContext.Request
SetMyResponse=MyScriptingContext.Response
SetMyServer=MyScriptingContext.Server
SetMySession=MyScriptingContext.Session
EndSub
以后我們就能用在VB中用MyApplication來代替ASP中的Application,同理可以代替Request,Server.....,不過我們來是要在OnStartPage之前來申明這些變量:
PrivateMyScriptingContextAsScriptingContext
PrivateMyApplicationAsApplication
PrivateMyRequestAsRequest
PrivateMyResponseAsResponse
PrivateMyServerAsServer
PrivateMySessionAsSession
使用ASP的對象
我們的變量現在就能像標準的ASP對象來使用了!比如,我們經常在ASP中用Request.form()來收集提交表單的數據.現在我們在我們的VB中實現這個功能,代碼如下:
用ASP中實現:
〈%
MyTempVariable=Request.Form("userName")
Response.Write("youentered"&MyTempVariable&"asyourusername")
%>
在VB中實現:
MyTempVariable=MyRequest.Form("userName")
MyResponse.Write("youentered"&MyTempVariable&"asyourusername")
通過使用MyResponse來代替Response,我們能夠使用所有Response的方法,當然,MyResponse這個名字可以隨便來取,你甚至可以就取Response.
另一件我們得注意的是,我們得在我們的建立的類中,寫上OnEndPage子函數,這個OnStartPage是相反的!OnStartPage是創建對象,OnEndPage是消毀對象.
PublicSubOnEndPage()
SetMyScriptingContext=Nothing
SetMyApplication=Nothing
SetMyRequest=Nothing
SetMyResponse=Nothing
SetMyServer=Nothing
SetMySession=Nothing
EndSub
SayHello方法
我們來建立一個子函數,用于顯示"HolleWorld".這個SayHello方法只是HelloWorld這個類中一個子函數,我們以后會在ASP中用以下的顯示這個方法
〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
SayHello的程序,很簡單的!
PublicSubSayHello()
MyResponse.Write("HelloWorld")
EndSub
現在一個小型的組件編寫完成,剩下的工作就是編譯這個組件,在"工程"菜單中保存它,取什么名字都可以,我們用Exmaple1.vbp吧!然后就用在菜單中選擇"makeexmaple1.dll",將其編譯成DLL文件.一個組件就真正完成了!
注意,編譯了此組件那么你就得先把你的PWS關掉,然后再編譯此組件.否則VB就會告訴你些組件在使用中.
在ASP中使用我們的自己的組件.
當你更正了在編譯中的錯誤,成功地編譯了example1這個工程,現在你就得拿出你最喜歡的HTML編輯器來寫下下面的語句,保存為ASP文件.
〈HTML>
〈HEAD>
〈TITLE>Example1〈/TITLE>
〈/HEAD>
〈BODY>
〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
〈/BODY>
〈/HTML>
運行后即可看到結果:
HelloWorld
注冊組件
如果你想和你的朋友,鄰居分享你的組件,那么你就得在你的系統上注冊你的組件.我們一般使用Regsvr32.exe來注冊組件.注冊后你的組件會出現在Win95/Win98的windows/system目錄中.下面是一個注冊的例子:
Regsvr32.exeC:/wwwroot/Example1/Example1.dll
在你的系統中,VB會自動給你注冊,所以你很少用到Regsvr32.exe
這里只是寫了一個非常小的組件,你可以寫好自己的更大的組件,而且還可以用VB中的很多控件.
附錄:建立注冊DLL和反注冊DLL文件的快捷方式
有的程序員經常要注冊或者反注冊自己寫的dll文件,加一個快捷方式會減少自己的工作量:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\dllfile\shell]
[HKEY_CLASSES_ROOT\dllfile\shell\register]
[HKEY_CLASSES_ROOT\dllfile\shell\register\command]
@="regsvr32 %1"
[HKEY_CLASSES_ROOT\dllfile\shell\Unregister]
"Command"="regsvr32 %1 /u"
[HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]
@="regsvr32 %1 /u"
當我們需要注冊或者反注冊dll時,只要在該dll文件上按下鼠標右鍵即可!
附錄注冊和注銷dll文件的方法:
一個快速注冊 DLL 及 OCX 的方法
有時候我們在 VB 中要引用某一個 DLL 或 OCX 時,會出現文件未注冊的訊息,這時,我們可以使用人工注冊的方法,也就是直接在命令列中使用 regsvr32.exe 來做,做法如下:
文件注冊:C:\Windows\System\Regsvr32.exe C:\Windows\System\Test.ocx
取消注冊:C:\Windows\System\Regsvr32.exe /u C:\Windows\System\Test.ocx
這些動作我們也可以直接寫到程序中,使用 Shell 來執行,但是我現在要說的,都不是上面提到的方法!
1、在資源管理器中找到 C:\Windows\System\Regsvr32.exe 并【復制】 ( 按鼠標右鍵選復制 )
2、將目錄移到 C:\Windows\SendTo 后,執行【貼上快捷方式】 ( 按鼠標右鍵選貼上快捷方式 )
3、將快捷方式名稱改成【REGISTER】
4、OK
現在,如果您想替某一個文件做注冊動作,例如:C:\Windows\System\Test.ocx,您只要打開資源管理器,找到 C:\Windows\System\Test.ocx,按鼠標右鍵選【傳送到】【REGISTER】即可完成注冊動作了!
注:有一個地方要注意的是,Regsvr32.exe 只能注冊 32 位的文件!如果要用它來注冊 16 位的文件,會有錯誤訊息產生。
附錄 某些dll文件的功能:
一、輕松修復IE瀏覽器
很多經常上網的朋友都有過 這樣的遭遇:IE不能打開新的窗口,用鼠標點擊超鏈接也沒有任何反應。這時重裝IE一般能解決問題。其實不必這么麻煩,使用Regsvr32命令就可以輕松搞定。
在“開始→運行”中鍵入“regsvr32 actxprxy.dll”命令,點擊“確定”按鈕,這時會彈出一個信息對話框“DllRegisterServer in actxprxy.dll succeeded”,點擊“確定”;然后再在“開始→運行”中鍵入“regsvr32 shdocvw.dll”命令,單擊“確定”即可。重新啟動后IE已經被輕松修復了。
二、解決Windows無法在線升級的問題
Windows的漏洞很多,每隔一段時間就需要使用“Windows Update”升級程序進行在線升級,不過“Windows Update”經常出現無法使用的情況,這時,我們可以使用Regsvr32來解決這個問題。
在“開始→運行”中鍵入“regsvr32 wupdinfo.dll”,點擊“確定”按鈕,這樣在系統中就重新注冊了“Windows Update”組件,重新啟動后問題已經解決。
三、防范網絡腳本病毒有新招
網絡腳本病毒嵌在網頁中,上網時在不知不覺中機器就會感染上這種病毒。筆者認為單純使用殺毒軟件并不能有效地防范這些腳本病毒,必須從病毒傳播的機理入手。網絡腳本病毒的復制、傳播都離不開FSO對象(File System Object,文件系統對象),因此禁用FSO對象就能有效地控制腳本病毒的傳播。操作方法很簡單:
在“開始→運行”中鍵入“regsvr32 /u scrrun.dll”就可以禁用FSO對象;如果需要使用FSO對象,鍵入“regsvr32 scrrun.dll”命令即可。
四、卸載Win XP自帶的“雞肋”功能
Win XP以功能強大而著稱,但有些功能卻常常令人有“雞肋”之感,比如Win XP自帶的ZIP功能和圖片預覽功能,不僅占用了系統資源,功能也遠不如第三方軟件強大。其實用Regsvr32命令可以很容易地卸載這些功能。
在“開始→運行”中鍵入“regsvr32 /u zipfldr.dll”,單擊“確定”按鈕,彈出卸載成功信息框后就完成了ZIP功能的卸載;要恢復ZIP功能,鍵入“regsvr32 zipfldr.dll”即可。同樣,卸載圖片預覽功能也很簡單,在“開始→運行”中鍵入“regsvr32 /u thumbvw.dll”即可;如果要恢復該功能,只須鍵入“regsvr32 thumbvw.dll”。
五、讓WMP播放器支持RM格式
很多朋友喜歡用Windows Media Player(以下簡稱WMP)播放器,但是它不支持RM格式,難道非得安裝其它播放軟件嗎?筆者有辦法。
以Win XP為例,首先下載一個RM格式插件,解壓縮后得到兩個文件夾: Release(用于Windows 9x)和Release Unicode (用于Windows 2000/XP);將Release Unicode文件夾下的RealMediaSplitter.ax文件拷貝到“系統盤符\WINDOWS\System32\”目錄下;在“開始→運行”中鍵入“regsvr32 RealMediaSplitter.ax”,點擊“確定”即可。接著下載解碼器,如Real Alternative,安裝后就能用WMP播放RM格式的影音文件了。
附錄:注冊和反注冊dll文件的批處理
dll.bat
------------------------------
@Regsvr32.exe AdminDLL.dll
un.bat
-------------------------------------
@Regsvr32.exe /u AdminDLL.dll