最新ASP講座之10:自己手工編寫組件
發(fā)表時(shí)間:2023-08-09 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在前面的內(nèi)容中,我們學(xué)習(xí)了組件的使用,網(wǎng)上的組件雖然不少,但往往小小的一個(gè)組件就要你掏出美元來(lái),而國(guó)產(chǎn)的組件又太少,想掏點(diǎn)人民幣還沒(méi)地兒好掏,算了,您干脆自己寫吧,其實(shí)編寫組件并不難,無(wú)非是剛開始寫...
在前面的內(nèi)容中,我們學(xué)習(xí)了組件的使用,網(wǎng)上的組件雖然不少,但往往小小的一個(gè)組件就要你掏出美元來(lái),而國(guó)產(chǎn)的組件又太少,想掏點(diǎn)人民幣還沒(méi)地兒好掏,算了,您干脆自己寫吧,其實(shí)編寫組件并不難,無(wú)非是剛開始寫低水平的組件,慢慢開始寫高水平的組件而已。要編寫ActiveX Server Components,有多種工具可供選擇:Visual Basic、C++、Java等等,這里選擇最簡(jiǎn)單的VB6.0,只要你以前用過(guò)VB,包你不到1小時(shí)之內(nèi),做一個(gè)小組件出來(lái)。
一、 組件編寫速成——編寫組件最基本的步驟
本部分主要講解編寫組件的基本步驟,如果你有進(jìn)一步學(xué)習(xí)的欲望,請(qǐng)參照VB6.0幫助文檔中“創(chuàng)建 ActiveX DLL”部分(MSDN Library中文檔文件名為Vbcon98.chm)。
目的:編寫一個(gè)最簡(jiǎn)單的加法器組件,這個(gè)組件有兩個(gè)屬性,一個(gè)方法。我們從最熟悉的地方開始,那就是先假設(shè)這個(gè)組件已經(jīng)存在,看看在ASP使用該組件的代碼:
<%
Dim objSum
‘ 先創(chuàng)建該組件,組件標(biāo)識(shí)為 TestDll.Sum
Set objSum = Server.CreateObject("TestDll.Sum")
‘ 記住TestDll.Sum 中的“TestDll”,“Sum”。
objSum.augend = 10.52 ‘a(chǎn)ugend 屬性為被加數(shù)
objSum.addend = 382.41 ‘a(chǎn)ddend 屬性為加數(shù)
Result = objSum.Plus ‘Plus 方法求和
Response.Write Result
Set objSum = Nothing
%>
請(qǐng)務(wù)必記住這幾個(gè)關(guān)鍵詞:TestDll、Sum、augend、addend、Plus,這將與接下來(lái)的工作緊密關(guān)聯(lián)。下面是詳細(xì)步驟:
1. 運(yùn)行VB6.0,在“文件”菜單中,單擊“新建工程”→在“新建工程”對(duì)話框中,雙擊“ActiveX DLL”圖標(biāo)→Visual Basic 將向該新工程中自動(dòng)添加一個(gè)類模塊 Class1(在“工程資源管理器”中可以看到,如圖1)。
2.按 F4 鍵打開“屬性”窗口。雙擊“名稱”屬性把“Class1”改成 Sum。
3.在“工程”菜單中,單擊“工程1 屬性”打開“工程屬性”對(duì)話框。在“工程名稱”中填寫TestDll,在“工程描述”中填寫“創(chuàng)建ActiveX DLL示例”。如圖2。
提示:ASP創(chuàng)建組件中的標(biāo)識(shí)TestDLL.Sum這兩項(xiàng)的意思明白了吧。
4.在“文件”菜單中,單擊“保存工程”,分別使用下面的名稱保存工程文件:SetupDll.cls和SetupDll.vbp。
5.為 Sum 類創(chuàng)建屬性:
(1) 在“工具”菜單中,選擇“添加過(guò)程”打開“添加過(guò)程”對(duì)話框。在“名稱”框中,輸入augend,單擊“屬性”,然后單擊“確定”,如圖3(注意:當(dāng)前焦點(diǎn)應(yīng)在代碼窗口,否則“添加過(guò)程”菜單無(wú)效)。
(2) 在“工具”菜單中,選擇“添加過(guò)程”打開“添加過(guò)程”對(duì)話框。在“名稱”框中,輸入addend,單擊“屬性”,然后單擊“確定”。
6.為 Sum 類創(chuàng)建方法:
在“工具”菜單中,單擊“添加過(guò)程”打開“添加過(guò)程”對(duì)話框。在“名稱”框中,輸入Plus,在類型中,你可以選擇“子程序”或“函數(shù)”,本例中由于要返回加數(shù)與被加數(shù)之和,故單擊“函數(shù)”,然后單擊“確定”。
現(xiàn)在,前面ASP代碼中的五個(gè)關(guān)鍵詞語(yǔ)都已用上,這下很多東西都明白了吧。
7.類模塊Sum代碼窗口中所有代碼如下:
Option Explicit
Private mdbl_augend As Double
Private mdbl_addend As Double
Public Property Get augend() As Double
augend = mdbl_augend
End Property
Public Property Let augend(ByVal vNewValue As Double)
mdbl_augend = vNewValue
End Property
Public Property Get addend() As Double
addend = mdbl_addend
End Property
Public Property Let addend(ByVal vNewValue As Double)
mdbl_addend = vNewValue
End Property
Public Function Plus()
Plus = augend + addend
End Function
你已經(jīng)注意到以上代碼與系統(tǒng)生成的代碼有點(diǎn)不同,主要是Public Property Get augend() As Variant部分用實(shí)際的數(shù)據(jù)類型Double替代了。
注意:實(shí)際上,當(dāng)執(zhí)行 x = objSum.augend 語(yǔ)句時(shí),調(diào)用的是 Property Get 過(guò)程,獲取mdbl_augend的值,而執(zhí)行 objSum.augend = 10.52 語(yǔ)句時(shí),將調(diào)用 Property Let 過(guò)程,將10.52賦給 mdbl_augend。
8.最后一步,在“文件”菜單中,單擊“生成.Dll(K)…”,生成文件SetupDll.dll。
到這里,組件已創(chuàng)建好了。現(xiàn)在,我們可以先在VB6中編寫一個(gè)測(cè)試工程,測(cè)試一下該文件正確與否。
1.在“文件”菜單中,單擊“新建工程” →雙擊“標(biāo)準(zhǔn)EXE”。
2.在“工程”菜單中,單擊“引用” →在“引用”對(duì)話框中按“瀏覽”按鈕,選擇剛剛編譯過(guò)的“SetupDll.dll”文件→單擊“確定”。
3.最后在代碼窗口中編寫如下代碼:
Option Explicit
Private Sub Form_Load()
Dim objSum As TestDll.Sum
Set objSum = New Sum
objSum.augend = 10.52
objSum.addend = 382.41
MsgBox objSum.Plus
End Sub
運(yùn)行一下,結(jié)果正確,接下來(lái)我們?cè)贏SP中使用這個(gè)組件。將SetupDll.dll拷到Web服務(wù)器中,并用“Regsvr32.exe setupdll.dll”命令注冊(cè)該組件,然后在瀏覽器中執(zhí)行本部分開頭的ASP程序。如果不行的話,你可以嘗試先用VB6的打包工具打包,然后再安裝,組件會(huì)自動(dòng)注冊(cè),而且一些必需的VB6運(yùn)行文件也會(huì)自動(dòng)安裝。
說(shuō)明:本部分所有程序均在下載包的Setupdll.zip中。
上面的例子中我們使用屬性過(guò)程Property Get和Property Let來(lái)添加屬性(Property Get讀取屬性的值,而Property Let給屬性賦值),若需要對(duì)設(shè)置的值進(jìn)行校驗(yàn),可在Property Let過(guò)程編寫適當(dāng)代碼。如下面代碼:
Public Property Let augend(ByVal vNewValue As Double)
If vNewValue < 100 Then
MsgBox "搞什么!小于100的值,自己心算就行了"
Else
mdbl_augend = vNewValue
End If
End Property
二、 給組件添加屬性和方法的其他途徑
1.添加屬性最簡(jiǎn)單的一種方法:添加公共變量,如上例最簡(jiǎn)單的代碼如下:
Option Explicit
Public augend As Double ‘ 添加 augend 屬性
Public addend As Double ‘ 添加 addend 屬性
Public Function Plus() As Double
Plus = augend + addend
End Function
但是,該方法只能設(shè)置可讀/寫屬性,且不能對(duì)所賦值進(jìn)行校驗(yàn)。如果僅需添加只讀屬性:在上例中,刪除Public Property Let augend(ByVal vNewValue As Double)過(guò)程,則augend便成了一只讀屬性,不能賦值。當(dāng)然,若要添加只寫屬性,只需刪除Property Get過(guò)程就可以了。
2.使用類生成器實(shí)用工具
VB6中還有一個(gè)添加屬性和方法的工具:在“外接程序”菜單中,單擊“外接程序管理器”,在跳出的外接程序管理器對(duì)話框中選擇“VB Class Builder Utility”,并在加載行為中選擇“加載/卸載”(如圖4)。然后再在“外接程序”菜單中單擊“類生成器實(shí)用工具”,您一看就會(huì)用。
三、 告訴你幾個(gè)要注意的問(wèn)題
1. 上面的例子是一個(gè)簡(jiǎn)單得不能再簡(jiǎn)單的組件,比較實(shí)用的組件一般都至少還有一個(gè)模塊(Module)。
2. 如果不小心, Visual Basic 可產(chǎn)生“單線程”組件。
也許最常見(jiàn)的一個(gè)陷阱就是使用了沒(méi)有被設(shè)計(jì)為在 ASP 下運(yùn)行的組件,如“單線程”組件。因此,請(qǐng)確保在“項(xiàng)目屬性”頁(yè)的“通用”選項(xiàng)卡上將線程模塊設(shè)置為“單元線程”。
3. 關(guān)于“類型不匹配”錯(cuò)誤。
一個(gè)好的建議是最好聲明 Out 參數(shù)為 Variant,注意上例中沒(méi)有這樣設(shè)置。
4. 關(guān)于全局變量的使用。
盡量避免在組件中使用全局變量。在 Visual Basic 術(shù)語(yǔ)中,這表示在標(biāo)準(zhǔn)的 .BAS 模塊中沒(méi)有 Public 或 Global 變量。因?yàn)镚lobal 變量并不是真正意義上的全局。每個(gè)線程都有自己的副本,如果幾種方法恰好在同一線程中執(zhí)行,它們將看到相同的變量;否則它們?cè)L問(wèn)的是這些變量的不同副本。這意味著您可能給一個(gè)全局變量賦了值(在線程 A 中),但其另一個(gè)用戶(在線程 B 中執(zhí)行)看不到新值。其原因是 Visual Basic 內(nèi)部使用“線程本地存儲(chǔ) (TLS)”來(lái)引用全局變量。這意味著每個(gè)線程都有自己的 Public 變量的副本,并且因?yàn)樗嬖诙鄠(gè)副本,全局?jǐn)?shù)據(jù)并不是真正“全局的”。也就是說(shuō),恰好在同一線程中運(yùn)行的用戶才會(huì)訪問(wèn)到同一個(gè)變量,不論他們是否期望如此。
最后順便提一下,VB6.0引入了一種全新的Visual Basic應(yīng)用程序:IIS應(yīng)用程序。你可以象創(chuàng)建ActiveX DLL一樣創(chuàng)建IIS應(yīng)用程序,任何用Active Server Pages創(chuàng)建的應(yīng)用程序都可以在VB開發(fā)環(huán)境中創(chuàng)建,你可以用單個(gè)的VB應(yīng)用程序完全替代所有的Active Server Pages。