使用VB開發封裝ASP的DLL例子

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.