封裝為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