---------------------------------------------------------------------------------
用VB編寫ActiveX DLL實現ASP編程(一(yī)).txt
---------------------------------------------------------------------------------
ASP是目前一(yī)種廣爲應用的用來快速構建動态WEB站點的編程語言,默認的内置開(kāi)發語言是VBScript,由于ASP和微軟Windows系列操作系統的結合非常的好,使得ASP已經成爲了NT開(kāi)發平台上面進行WEB開(kāi)發的首選語言和環境。他有着簡單易學,方便快速開(kāi)發的種種優點,但是他也有着緻命的弱點,就是他是腳本語言解釋執行的,速度會受到一(yī)定的影響,更爲關鍵的是,使用ASP來開(kāi)發完成一(yī)個項目之後,整個項目在交付客戶使用的時候,是會連帶所有的ASP腳本源代碼的,也就無法将商(shāng)業程序保密了,源代碼洩漏會給自己造成很大(dà)的損失,雖然微軟也相應的推出了用來加密ASP程序的軟件,但是有着諸多的限制,以及會降低程序運行的速度和二次開(kāi)發調試的難度,難道ASP做出來的項目就真的要暴露所有的源代碼嗎(ma)?
當然了,答案當然是否定的,因爲世界上沒有絕對不可能的事情,接下(xià)來就跟随我(wǒ)(wǒ)來看看如何利用VB的ActiveX DLL來實現将ASP程序封裝起來吧,也就是我(wǒ)(wǒ)們可以使用ActiveX DLL來完成所有ASP能完成的事情,而ActiveX DLL是編譯好的DLL文件,别人是無法得知(zhī)你的源代碼的,也就保證的自己的商(shāng)業機密和核心技術,并且達到同樣的效果,使用完全封裝的ActiveX DLL會比完全适用ASP腳本語言的執行速度要快很多,尤其是大(dà)運算量的時候跟爲明顯!經過我(wǒ)(wǒ)們的具體(tǐ)測試,在操縱10000條數據庫記錄的時候,封裝成爲ActiveX DLL的WEB應用程序比純ASP代碼的應用程序,速度上面要快大(dà)約21%左右,在目前國内過于緩慢(màn)的網絡來講,速度就是一(yī)個WEB站點的很關鍵的一(yī)部分(fēn)。并且采用了ActiveX DLL來開(kāi)發WEB程序,要比單純使用ASP好得多,畢竟ASP隻能使用VBScript來開(kāi)發,無法享用VB大(dà)量的優點,而ActiveX DLL則可以充分(fēn)利用VB裏面所有的特性。
下(xià)面我(wǒ)(wǒ)們先來看看什麽是ActiveX DLL吧。ActiveX是微軟提出的廣泛應用于Windows系列的一(yī)種代碼封裝技術,提高了程序代碼的可重用性,加快了程序項目的開(kāi)發速度,一(yī)般被稱爲“組件”。在VB6的集成開(kāi)發環境當中(zhōng),我(wǒ)(wǒ)們可以看到一(yī)下(xià)幾種ActiveX項目:
1、ActiveX EXE
這是在“過程外(wài)”運行的ActiveX/COM服務器組件,也就是說他們運行的過程和初始化組件的客戶機代碼不同。盡管可以用ASP訪問ActiveX EXE,但是不推薦改動IIS元庫,該庫允許所有的可執行文件由服務器上運行的腳本代碼啓動。
2、ActiveX OCXs
這些特殊的組件把主機應用程序顯示和操作組件所需的附加支持包含在GUI環境中(zhōng)。還可以把OCX組件放(fàng)在網頁當中(zhōng)。但是,OCX是應用程序界面,不可以使用ASP來創建的。
3、ActiveX文檔DLL和ActiveX文檔EXE
Active文檔可以在OLE文件箱應用程序中(zhōng),例如IE或者Office Binder,顯示VB表單。但他們在ASP不能應用。
4、ActiveX DLLs
這些ActiveX/COM組件和初始化組件的客戶機在同一(yī)個進程中(zhōng)運行。而我(wǒ)(wǒ)們要讨論的ActiveX DLL正是整個組件。一(yī)般微軟的附加組件和其他的一(yī)些第三方廠家提供的各種組件都是這種類型的ActiveX DLL,但是并不全是使用VB編寫的,同樣可以使用VC/JAVA等等語言來開(kāi)發。
探讨完了什麽是ActiveX DLL,我(wǒ)(wǒ)們開(kāi)始正式編寫我(wǒ)(wǒ)們自己的ActiveX DLL,以便來實現ASP中(zhōng)的同樣功能,衆所周知(zhī),ASP内置了Response、Request、Server、Session、Application五個對象,其實這五個内置對象正是IIS控制台初始化的五個ActiveX DLL組件,既然IIS可以初始化這五個組件用于ASP中(zhōng),我(wǒ)(wǒ)們當然也可以直接在我(wǒ)(wǒ)們的ActiveX DLL中(zhōng)引用這些組件來實現我(wǒ)(wǒ)們的編程,也就是說我(wǒ)(wǒ)們可以在VB應用程序中(zhōng)通過引用這些組件來實現訪問ASP内置對象的功能。
隻要你安裝了PWS4或者IIS4以上的WEB服務器,你就擁有了一(yī)個名稱叫做“Microsoft Active Server Pages Object”的對象庫,我(wǒ)(wǒ)們可以在VB的ActiveX DLL應用中(zhōng)引用這個對象庫,通過引用這個對象庫,我(wǒ)(wǒ)們就獲得了一(yī)個對象(類):ScriptingContext,這個對象也正是我(wǒ)(wǒ)們整個文章探讨的核心對象。對象庫内的關系如下(xià):
對象庫 類 類成員(yuán)
ASPTypeLibrary ScriptingContext Application
Request
Response
Session
Server
通過上面的關系圖,我(wǒ)(wǒ)們就可以很容易理解類ScriptingContent。下(xià)面我(wǒ)(wǒ)們來看一(yī)個具體(tǐ)的例子吧:
1、 使用VB6創建一(yī)個新的ActiveX DLL項目
2、 引用“Microsoft Active Server Pages Object”對象庫。
3、 創建兩個組件事件:OnStartPage以及OnEndPage
4、 在事件OnStartPage中(zhōng)創建類ScriptingContent的一(yī)個引用。
5、 實例化類ScriptingContent。
Test.cls (類實現)
''對象的聲明
Dim rp as Response
Dim rq as Request
Dim ap as Application
Dim sr as Server
Dim sn as Session
''當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(mysc as ScriptingContent)
''進行對象的實例化
set rp=mysc.Response
set rq=mysc.Request
set sr=mysc.Server
set ap=mysc.Application
set sn=mysc.Session
rp.write "<br>ActiveX DLL組件已經被創建了!<br>"
End Sub
''當組件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
Rp.write "<br>ActiveX DLL組件已經被銷毀!<br>"
''銷毀對象
Set rp=nothing
Set rq=nothing
Set sr=nothing
Set ap=nothing
Set sn=nothing
End Sub
''定義我(wǒ)(wǒ)們自己的一(yī)個組件方法
Public Sub HelloWorld()
Rp.write "<H1>Hello,World!</H1>"
End Sub
這樣,我(wǒ)(wǒ)們就創建可以訪問ASP内置對象的ActiveX DLL了。我(wǒ)(wǒ)們命名這個組件項目爲first,在VB中(zhōng)間編譯這項目成爲一(yī)個DLL文件first.dll,并且我(wǒ)(wǒ)們在系統中(zhōng)注冊這個DLL文件。接下(xià)來,我(wǒ)(wǒ)們需要一(yī)個簡單的幾乎沒有什麽代碼的ASP程序來調用這個組件:
test.asp
<html>
<head>
<title>測試ActiveX DLL</title>
</head>
<body>
<%
Dim testme
''創建我(wǒ)(wǒ)們剛才編譯成功的組件,一(yī)旦創建這個組件,同時會在葉面輸出文字“ActiveX DLL組件已經被
''創建了!”
set testme=server.createobject("first.test")
''調用組件的方法
testme.HelloWorld
''注銷組件,在注銷的同時,會自動在葉面顯示“ActiveX DLL組件已經被銷毀!”
set testme=nothing
%>
</body>
</html>
通過上面簡單的例子,我(wǒ)(wǒ)們可以看到使用ActiveX DLL同樣可以實現和ASP同樣的功能,并且帶來的代碼保密和程序運行更加高效的優點。ActiveX DLL和純ASP有着各自的優點和缺點,隻要我(wǒ)(wǒ)們合理的運用這兩種技術,比如适當的将商(shāng)業邏輯封裝在ActiveX DLL中(zhōng),或者在需要保密的地方使用DLL封裝技術,一(yī)定可以編寫出高效快速的WEB應用程序。
---------------------------------------------------------------------------------
用VB編寫ActiveX DLL實現ASP編程(二).txt
---------------------------------------------------------------------------------
首先,服務器端的組件要有别于客戶端的組件.客戶端的組件是通過網絡傳輸,依*HTML來起作用.而且隻能在IE上有用.但是服 務器端的組件是運行在服務器端,它在服務器上執行各種操作.因此,所有的浏覽器都能享用,它依靠的是服務器而不是浏覽器.
當IIS被請求執行一(yī)個ASP程序,它首先會在ASP文件中(zhōng)找到〈%%>标簽之間的代碼,并且執行它(也可以是〈scri ptrunat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那麽它就會用 内存中(zhōng)的編譯過的程序來向用戶返回HTML代碼,如果沒有,那麽它就重新編譯.這裏ASP就比CGI多一(yī)點速度優勢,因爲CGI 是每一(yī)個請求都使用一(yī)個線程.這樣就大(dà)大(dà)消耗了服務器的資(zī)源.
想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立DynamicLin kedLibraries(DLL文件),它能在IIS上直接運行(如果有asp文件來請求的話(huà)).
系統和軟件的要求
你需要一(yī)個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我(wǒ)(wǒ)們下(xià)面的程序是在windows95+PWS+VB 5的環境下(xià)開(kāi)發的.
我(wǒ)(wǒ)們開(kāi)始吧
啓動你的VB,選擇ActiveX圖标.這個圖标可以在新建工(gōng)程找到!VB會提供一(yī)個默認的工(gōng)程名(project1)和類名( class1).我(wǒ)(wǒ)們會将這兩個名字都改掉.在改名之前,請首先确認我(wǒ)(wǒ)們擁有MicrosoftActiveServerPag esObjectLibrary,它在我(wǒ)(wǒ)們的程序非常有用.從菜單中(zhōng)選擇工(gōng)程,然後在其中(zhōng)選擇引用,就會出現引用窗 口
從中(zhōng)選擇MicrosoftActiveServerPagesObjectLibrary.
給工(gōng)程和類命名
現在我(wǒ)(wǒ)們來根據自己的愛好來爲project1和class1來命名吧!給它們命名也是很重要的,我(wǒ)(wǒ)們以後會用這個工(gōng)程名和類名 來創建這個組件的實例!後面詳細介紹.
如何改名,我(wǒ)(wǒ)就不想多說了!
我(wǒ)(wǒ)們的工(gōng)程名改爲Exmaple,類名爲Helloword
怎樣使用工(gōng)程和類
現在我(wǒ)(wǒ)們有了我(wǒ)(wǒ)們自己的工(gōng)程(Example1)和類名(HelloWorld).以後我(wǒ)(wǒ)們就會在ASP代碼中(zhōng)使用它們的名字來 引用這個組件.在ASP中(zhōng)我(wǒ)(wǒ)們就這樣引用,如下(xià):
SetObjReference=Server.CreateObject(ProjectName.ClassName)
對于我(wǒ)(wǒ)們工(gōng)程的引用就是:
SetObjReference=Server.CreateObject(Example1.HelloWorld)
現在我(wǒ)(wǒ)們就能用ObjReference來調用我(wǒ)(wǒ)們在組件中(zhōng)所創建的函數,子程序.下(xià)面我(wǒ)(wǒ)們會來寫一(yī)個SayHello的子程序 ,我(wǒ)(wǒ)們執行它的代碼如下(xià):
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
爲了在Helloword類中(zhōng)使用ASP的方法,你必須在此類中(zhōng)寫一(yī)個OnStartPage
子函數.如下(xià):
PublicSubOnStartPage(PassedScriptingContextAsScriptingContex t)
SetMyScriptingContext=PassedScriptingContext
EndSub
現在,無論什麽時候用戶訪問一(yī)個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我(wǒ)(wǒ)們的對象請我(wǒ)(wǒ)們 使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我(wǒ)(wǒ)們有能力訪問所有ASP的對象.看 下(xià)面的代碼:
PublicSubOnStartPage(PassedScriptingContextAsScriptingContex t)
SetMyScriptingContext=PassedScriptingContext
SetMyApplication=MyScriptingContext.Application
SetMyRequest=MyScriptingContext.Request
SetMyResponse=MyScriptingContext.Response
SetMyServer=MyScriptingContext.Server
SetMySession=MyScriptingContext.Session
EndSub
以後我(wǒ)(wǒ)們就能用在VB中(zhōng)用MyApplication來代替ASP中(zhōng)的Application,同理可以代替Request,S erver.....,不過我(wǒ)(wǒ)們來是要在OnStartPage之前來申明這些變量:
PrivateMyScriptingContextAsScriptingContext
PrivateMyApplicationAsApplication
PrivateMyRequestAsRequest
PrivateMyResponseAsResponse
PrivateMyServerAsServer
PrivateMySessionAsSession
使用ASP的對象
我(wǒ)(wǒ)們的變量現在就能像标準的ASP對象來使用了!比如,我(wǒ)(wǒ)們經常在ASP中(zhōng)用Request.form()來收集提交表單的數據 .現在我(wǒ)(wǒ)們在我(wǒ)(wǒ)們的VB中(zhōng)實現這個功能,代碼如下(xià):
用ASP中(zhōng)實現:
〈%
MyTempVariable=Request.Form(userName)
Response.Write(youentered&MyTempVariable&asyourus ername)
%>
在VB中(zhōng)實現:
MyTempVariable=MyRequest.Form(userName)
My Response.Write(youentered&MyTempVariable&asyourus ername)
通過使用MyResponse來代替Response,我(wǒ)(wǒ)們能夠使用所有Response的方法,當然,MyResponse這 個名字可以随便來取,你甚至可以就取Response.
另一(yī)件我(wǒ)(wǒ)們得注意的是,我(wǒ)(wǒ)們得在我(wǒ)(wǒ)們的建立的類中(zhōng),寫上OnEndPage子函數,這個OnStartPage是相反的!OnS tartPage是創建對象,OnEndPage是消毀對象.
PublicSubOnEndPage()
SetMyScriptingContext=Nothing
SetMyApplication=Nothing
SetMyRequest=Nothing
SetMyResponse=Nothing
SetMyServer=Nothing
SetMySession=Nothing
EndSub
SayHello方法
我(wǒ)(wǒ)們來建立一(yī)個子函數,用于顯示HolleWorld.這個SayHello方法隻是HelloWorld這個類中(zhōng)一(yī)個子函 數,我(wǒ)(wǒ)們以後會在ASP中(zhōng)用以下(xià)的顯示這個方法
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
SayHello的程序,很簡單的!
PublicSubSayHello()
MyResponse.Write(HelloWorld)
EndSub
現在一(yī)個小(xiǎo)型的組件編寫完成,剩下(xià)的工(gōng)作就是編譯這個組件,在工(gōng)程菜單中(zhōng)保存它,取什麽名字都可以,我(wǒ)(wǒ)們用Exmaple1 .vbp吧!然後就用在菜單中(zhōng)選擇makeexmaple1.dll,将其編譯成DLL文件.一(yī)個組件就真正完成了!
注意,編譯了此組件那麽你就得先把你的PWS關掉,然後再編譯此組件.否則VB就會告訴你些組件在使用中(zhōng).
在ASP中(zhōng)使用我(wǒ)(wǒ)們的自己的組件.
當你更正了在編譯中(zhōng)的錯誤,成功地編譯了example1這個工(gōng)程,現在你就得拿出你最喜歡的HTML編輯器來寫下(xià)下(xià)面的語句, 保存爲ASP文件.
〈HTML>
〈HEAD>
〈TITLE>Example1〈/TITLE>
〈/HEAD>
〈BODY>
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
〈/BODY>
〈/HTML>
運行後即可看到結果:
HelloWorld
注冊組件
如果你想和你的朋友,鄰居分(fēn)享你的組件,那麽你就得在你的系統上注冊你的組件.我(wǒ)(wǒ)們一(yī)般使用Regsvr32.exe來注冊組件 .注冊後你的組件會出現在Win95/Win98的windows/system目錄中(zhōng).下(xià)面是一(yī)個注冊的例子:
Regsvr32.exeC:/wwwroot/Example1/Example1.dll
在你的系統中(zhōng),VB會自動給你注冊,所以你很少用到Regsvr32.exe
用VB編寫ActiveX DLL實現ASP編程(一(yī)).txt
---------------------------------------------------------------------------------
ASP是目前一(yī)種廣爲應用的用來快速構建動态WEB站點的編程語言,默認的内置開(kāi)發語言是VBScript,由于ASP和微軟Windows系列操作系統的結合非常的好,使得ASP已經成爲了NT開(kāi)發平台上面進行WEB開(kāi)發的首選語言和環境。他有着簡單易學,方便快速開(kāi)發的種種優點,但是他也有着緻命的弱點,就是他是腳本語言解釋執行的,速度會受到一(yī)定的影響,更爲關鍵的是,使用ASP來開(kāi)發完成一(yī)個項目之後,整個項目在交付客戶使用的時候,是會連帶所有的ASP腳本源代碼的,也就無法将商(shāng)業程序保密了,源代碼洩漏會給自己造成很大(dà)的損失,雖然微軟也相應的推出了用來加密ASP程序的軟件,但是有着諸多的限制,以及會降低程序運行的速度和二次開(kāi)發調試的難度,難道ASP做出來的項目就真的要暴露所有的源代碼嗎(ma)?
當然了,答案當然是否定的,因爲世界上沒有絕對不可能的事情,接下(xià)來就跟随我(wǒ)(wǒ)來看看如何利用VB的ActiveX DLL來實現将ASP程序封裝起來吧,也就是我(wǒ)(wǒ)們可以使用ActiveX DLL來完成所有ASP能完成的事情,而ActiveX DLL是編譯好的DLL文件,别人是無法得知(zhī)你的源代碼的,也就保證的自己的商(shāng)業機密和核心技術,并且達到同樣的效果,使用完全封裝的ActiveX DLL會比完全适用ASP腳本語言的執行速度要快很多,尤其是大(dà)運算量的時候跟爲明顯!經過我(wǒ)(wǒ)們的具體(tǐ)測試,在操縱10000條數據庫記錄的時候,封裝成爲ActiveX DLL的WEB應用程序比純ASP代碼的應用程序,速度上面要快大(dà)約21%左右,在目前國内過于緩慢(màn)的網絡來講,速度就是一(yī)個WEB站點的很關鍵的一(yī)部分(fēn)。并且采用了ActiveX DLL來開(kāi)發WEB程序,要比單純使用ASP好得多,畢竟ASP隻能使用VBScript來開(kāi)發,無法享用VB大(dà)量的優點,而ActiveX DLL則可以充分(fēn)利用VB裏面所有的特性。
下(xià)面我(wǒ)(wǒ)們先來看看什麽是ActiveX DLL吧。ActiveX是微軟提出的廣泛應用于Windows系列的一(yī)種代碼封裝技術,提高了程序代碼的可重用性,加快了程序項目的開(kāi)發速度,一(yī)般被稱爲“組件”。在VB6的集成開(kāi)發環境當中(zhōng),我(wǒ)(wǒ)們可以看到一(yī)下(xià)幾種ActiveX項目:
1、ActiveX EXE
這是在“過程外(wài)”運行的ActiveX/COM服務器組件,也就是說他們運行的過程和初始化組件的客戶機代碼不同。盡管可以用ASP訪問ActiveX EXE,但是不推薦改動IIS元庫,該庫允許所有的可執行文件由服務器上運行的腳本代碼啓動。
2、ActiveX OCXs
這些特殊的組件把主機應用程序顯示和操作組件所需的附加支持包含在GUI環境中(zhōng)。還可以把OCX組件放(fàng)在網頁當中(zhōng)。但是,OCX是應用程序界面,不可以使用ASP來創建的。
3、ActiveX文檔DLL和ActiveX文檔EXE
Active文檔可以在OLE文件箱應用程序中(zhōng),例如IE或者Office Binder,顯示VB表單。但他們在ASP不能應用。
4、ActiveX DLLs
這些ActiveX/COM組件和初始化組件的客戶機在同一(yī)個進程中(zhōng)運行。而我(wǒ)(wǒ)們要讨論的ActiveX DLL正是整個組件。一(yī)般微軟的附加組件和其他的一(yī)些第三方廠家提供的各種組件都是這種類型的ActiveX DLL,但是并不全是使用VB編寫的,同樣可以使用VC/JAVA等等語言來開(kāi)發。
探讨完了什麽是ActiveX DLL,我(wǒ)(wǒ)們開(kāi)始正式編寫我(wǒ)(wǒ)們自己的ActiveX DLL,以便來實現ASP中(zhōng)的同樣功能,衆所周知(zhī),ASP内置了Response、Request、Server、Session、Application五個對象,其實這五個内置對象正是IIS控制台初始化的五個ActiveX DLL組件,既然IIS可以初始化這五個組件用于ASP中(zhōng),我(wǒ)(wǒ)們當然也可以直接在我(wǒ)(wǒ)們的ActiveX DLL中(zhōng)引用這些組件來實現我(wǒ)(wǒ)們的編程,也就是說我(wǒ)(wǒ)們可以在VB應用程序中(zhōng)通過引用這些組件來實現訪問ASP内置對象的功能。
隻要你安裝了PWS4或者IIS4以上的WEB服務器,你就擁有了一(yī)個名稱叫做“Microsoft Active Server Pages Object”的對象庫,我(wǒ)(wǒ)們可以在VB的ActiveX DLL應用中(zhōng)引用這個對象庫,通過引用這個對象庫,我(wǒ)(wǒ)們就獲得了一(yī)個對象(類):ScriptingContext,這個對象也正是我(wǒ)(wǒ)們整個文章探讨的核心對象。對象庫内的關系如下(xià):
對象庫 類 類成員(yuán)
ASPTypeLibrary ScriptingContext Application
Request
Response
Session
Server
通過上面的關系圖,我(wǒ)(wǒ)們就可以很容易理解類ScriptingContent。下(xià)面我(wǒ)(wǒ)們來看一(yī)個具體(tǐ)的例子吧:
1、 使用VB6創建一(yī)個新的ActiveX DLL項目
2、 引用“Microsoft Active Server Pages Object”對象庫。
3、 創建兩個組件事件:OnStartPage以及OnEndPage
4、 在事件OnStartPage中(zhōng)創建類ScriptingContent的一(yī)個引用。
5、 實例化類ScriptingContent。
Test.cls (類實現)
''對象的聲明
Dim rp as Response
Dim rq as Request
Dim ap as Application
Dim sr as Server
Dim sn as Session
''當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(mysc as ScriptingContent)
''進行對象的實例化
set rp=mysc.Response
set rq=mysc.Request
set sr=mysc.Server
set ap=mysc.Application
set sn=mysc.Session
rp.write "<br>ActiveX DLL組件已經被創建了!<br>"
End Sub
''當組件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
Rp.write "<br>ActiveX DLL組件已經被銷毀!<br>"
''銷毀對象
Set rp=nothing
Set rq=nothing
Set sr=nothing
Set ap=nothing
Set sn=nothing
End Sub
''定義我(wǒ)(wǒ)們自己的一(yī)個組件方法
Public Sub HelloWorld()
Rp.write "<H1>Hello,World!</H1>"
End Sub
這樣,我(wǒ)(wǒ)們就創建可以訪問ASP内置對象的ActiveX DLL了。我(wǒ)(wǒ)們命名這個組件項目爲first,在VB中(zhōng)間編譯這項目成爲一(yī)個DLL文件first.dll,并且我(wǒ)(wǒ)們在系統中(zhōng)注冊這個DLL文件。接下(xià)來,我(wǒ)(wǒ)們需要一(yī)個簡單的幾乎沒有什麽代碼的ASP程序來調用這個組件:
test.asp
<html>
<head>
<title>測試ActiveX DLL</title>
</head>
<body>
<%
Dim testme
''創建我(wǒ)(wǒ)們剛才編譯成功的組件,一(yī)旦創建這個組件,同時會在葉面輸出文字“ActiveX DLL組件已經被
''創建了!”
set testme=server.createobject("first.test")
''調用組件的方法
testme.HelloWorld
''注銷組件,在注銷的同時,會自動在葉面顯示“ActiveX DLL組件已經被銷毀!”
set testme=nothing
%>
</body>
</html>
通過上面簡單的例子,我(wǒ)(wǒ)們可以看到使用ActiveX DLL同樣可以實現和ASP同樣的功能,并且帶來的代碼保密和程序運行更加高效的優點。ActiveX DLL和純ASP有着各自的優點和缺點,隻要我(wǒ)(wǒ)們合理的運用這兩種技術,比如适當的将商(shāng)業邏輯封裝在ActiveX DLL中(zhōng),或者在需要保密的地方使用DLL封裝技術,一(yī)定可以編寫出高效快速的WEB應用程序。
---------------------------------------------------------------------------------
用VB編寫ActiveX DLL實現ASP編程(二).txt
---------------------------------------------------------------------------------
首先,服務器端的組件要有别于客戶端的組件.客戶端的組件是通過網絡傳輸,依*HTML來起作用.而且隻能在IE上有用.但是服 務器端的組件是運行在服務器端,它在服務器上執行各種操作.因此,所有的浏覽器都能享用,它依靠的是服務器而不是浏覽器.
當IIS被請求執行一(yī)個ASP程序,它首先會在ASP文件中(zhōng)找到〈%%>标簽之間的代碼,并且執行它(也可以是〈scri ptrunat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那麽它就會用 内存中(zhōng)的編譯過的程序來向用戶返回HTML代碼,如果沒有,那麽它就重新編譯.這裏ASP就比CGI多一(yī)點速度優勢,因爲CGI 是每一(yī)個請求都使用一(yī)個線程.這樣就大(dà)大(dà)消耗了服務器的資(zī)源.
想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立DynamicLin kedLibraries(DLL文件),它能在IIS上直接運行(如果有asp文件來請求的話(huà)).
系統和軟件的要求
你需要一(yī)個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我(wǒ)(wǒ)們下(xià)面的程序是在windows95+PWS+VB 5的環境下(xià)開(kāi)發的.
我(wǒ)(wǒ)們開(kāi)始吧
啓動你的VB,選擇ActiveX圖标.這個圖标可以在新建工(gōng)程找到!VB會提供一(yī)個默認的工(gōng)程名(project1)和類名( class1).我(wǒ)(wǒ)們會将這兩個名字都改掉.在改名之前,請首先确認我(wǒ)(wǒ)們擁有MicrosoftActiveServerPag esObjectLibrary,它在我(wǒ)(wǒ)們的程序非常有用.從菜單中(zhōng)選擇工(gōng)程,然後在其中(zhōng)選擇引用,就會出現引用窗 口
從中(zhōng)選擇MicrosoftActiveServerPagesObjectLibrary.
給工(gōng)程和類命名
現在我(wǒ)(wǒ)們來根據自己的愛好來爲project1和class1來命名吧!給它們命名也是很重要的,我(wǒ)(wǒ)們以後會用這個工(gōng)程名和類名 來創建這個組件的實例!後面詳細介紹.
如何改名,我(wǒ)(wǒ)就不想多說了!
我(wǒ)(wǒ)們的工(gōng)程名改爲Exmaple,類名爲Helloword
怎樣使用工(gōng)程和類
現在我(wǒ)(wǒ)們有了我(wǒ)(wǒ)們自己的工(gōng)程(Example1)和類名(HelloWorld).以後我(wǒ)(wǒ)們就會在ASP代碼中(zhōng)使用它們的名字來 引用這個組件.在ASP中(zhōng)我(wǒ)(wǒ)們就這樣引用,如下(xià):
SetObjReference=Server.CreateObject(ProjectName.ClassName)
對于我(wǒ)(wǒ)們工(gōng)程的引用就是:
SetObjReference=Server.CreateObject(Example1.HelloWorld)
現在我(wǒ)(wǒ)們就能用ObjReference來調用我(wǒ)(wǒ)們在組件中(zhōng)所創建的函數,子程序.下(xià)面我(wǒ)(wǒ)們會來寫一(yī)個SayHello的子程序 ,我(wǒ)(wǒ)們執行它的代碼如下(xià):
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
爲了在Helloword類中(zhōng)使用ASP的方法,你必須在此類中(zhōng)寫一(yī)個OnStartPage
子函數.如下(xià):
PublicSubOnStartPage(PassedScriptingContextAsScriptingContex t)
SetMyScriptingContext=PassedScriptingContext
EndSub
現在,無論什麽時候用戶訪問一(yī)個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我(wǒ)(wǒ)們的對象請我(wǒ)(wǒ)們 使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我(wǒ)(wǒ)們有能力訪問所有ASP的對象.看 下(xià)面的代碼:
PublicSubOnStartPage(PassedScriptingContextAsScriptingContex t)
SetMyScriptingContext=PassedScriptingContext
SetMyApplication=MyScriptingContext.Application
SetMyRequest=MyScriptingContext.Request
SetMyResponse=MyScriptingContext.Response
SetMyServer=MyScriptingContext.Server
SetMySession=MyScriptingContext.Session
EndSub
以後我(wǒ)(wǒ)們就能用在VB中(zhōng)用MyApplication來代替ASP中(zhōng)的Application,同理可以代替Request,S erver.....,不過我(wǒ)(wǒ)們來是要在OnStartPage之前來申明這些變量:
PrivateMyScriptingContextAsScriptingContext
PrivateMyApplicationAsApplication
PrivateMyRequestAsRequest
PrivateMyResponseAsResponse
PrivateMyServerAsServer
PrivateMySessionAsSession
使用ASP的對象
我(wǒ)(wǒ)們的變量現在就能像标準的ASP對象來使用了!比如,我(wǒ)(wǒ)們經常在ASP中(zhōng)用Request.form()來收集提交表單的數據 .現在我(wǒ)(wǒ)們在我(wǒ)(wǒ)們的VB中(zhōng)實現這個功能,代碼如下(xià):
用ASP中(zhōng)實現:
〈%
MyTempVariable=Request.Form(userName)
Response.Write(youentered&MyTempVariable&asyourus ername)
%>
在VB中(zhōng)實現:
MyTempVariable=MyRequest.Form(userName)
My Response.Write(youentered&MyTempVariable&asyourus ername)
通過使用MyResponse來代替Response,我(wǒ)(wǒ)們能夠使用所有Response的方法,當然,MyResponse這 個名字可以随便來取,你甚至可以就取Response.
另一(yī)件我(wǒ)(wǒ)們得注意的是,我(wǒ)(wǒ)們得在我(wǒ)(wǒ)們的建立的類中(zhōng),寫上OnEndPage子函數,這個OnStartPage是相反的!OnS tartPage是創建對象,OnEndPage是消毀對象.
PublicSubOnEndPage()
SetMyScriptingContext=Nothing
SetMyApplication=Nothing
SetMyRequest=Nothing
SetMyResponse=Nothing
SetMyServer=Nothing
SetMySession=Nothing
EndSub
SayHello方法
我(wǒ)(wǒ)們來建立一(yī)個子函數,用于顯示HolleWorld.這個SayHello方法隻是HelloWorld這個類中(zhōng)一(yī)個子函 數,我(wǒ)(wǒ)們以後會在ASP中(zhōng)用以下(xià)的顯示這個方法
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
SayHello的程序,很簡單的!
PublicSubSayHello()
MyResponse.Write(HelloWorld)
EndSub
現在一(yī)個小(xiǎo)型的組件編寫完成,剩下(xià)的工(gōng)作就是編譯這個組件,在工(gōng)程菜單中(zhōng)保存它,取什麽名字都可以,我(wǒ)(wǒ)們用Exmaple1 .vbp吧!然後就用在菜單中(zhōng)選擇makeexmaple1.dll,将其編譯成DLL文件.一(yī)個組件就真正完成了!
注意,編譯了此組件那麽你就得先把你的PWS關掉,然後再編譯此組件.否則VB就會告訴你些組件在使用中(zhōng).
在ASP中(zhōng)使用我(wǒ)(wǒ)們的自己的組件.
當你更正了在編譯中(zhōng)的錯誤,成功地編譯了example1這個工(gōng)程,現在你就得拿出你最喜歡的HTML編輯器來寫下(xià)下(xià)面的語句, 保存爲ASP文件.
〈HTML>
〈HEAD>
〈TITLE>Example1〈/TITLE>
〈/HEAD>
〈BODY>
〈%
SetObjReference=Server.CreateObject(Example1.HelloWorld)
ObjReference.SayHello
%>
〈/BODY>
〈/HTML>
運行後即可看到結果:
HelloWorld
注冊組件
如果你想和你的朋友,鄰居分(fēn)享你的組件,那麽你就得在你的系統上注冊你的組件.我(wǒ)(wǒ)們一(yī)般使用Regsvr32.exe來注冊組件 .注冊後你的組件會出現在Win95/Win98的windows/system目錄中(zhōng).下(xià)面是一(yī)個注冊的例子:
Regsvr32.exeC:/wwwroot/Example1/Example1.dll
在你的系統中(zhōng),VB會自動給你注冊,所以你很少用到Regsvr32.exe