ASP組件初級入門與精通系列之一
一直以來,想寫一些組件方面的應用,這段時間終於可以寫一點自己喜歡的東西。
希望大家通過這些教程學習後,可以隨心所欲的寫出自己的組件。
每篇文章可能沒有關聯,只是寫一些組件編寫過程中出現的問題。
歡迎大家批評指正
環境:winxp+vb6+sp6+visual interdev6.0
作為第一篇,我們先來寫一個比較簡單的組件
完成的功能是:輸入兩個數相加,返回相加的結果
打開vb6,新建Activex Dll工程。工程名修改為fCom,類名修改為fC1
點擊菜單->工具->添加過程
我們在名稱內輸入Add,類型選擇函數,范圍選擇公有,然後確定即可
生成如下代碼,我們繼續完善
程序代碼
Option Explicit
Public Function Add(ByVal a As Long, ByVal b As Long) As Long
Add = a + b
End Function
Ok,一個簡單的組件就寫好了,點擊菜單->文件->生成fCom.dll文件
確定,在目錄下就會有fCom.dll文件
測試
打開visual interdev6.0,生成一個ASP文件,為什麼要使用interdev,因為它有代碼提示功能,與vb的ide環境一致,方便書寫
程序代碼
<%@ Language=VBScript %>
<Html>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
set obj=server.CreateObject("fCom.fC1")
'下面這句注意了,因為函數有返回值的,不能按下面的方法寫,否則IE中會報錯
'obj.Add(3,4)
'錯誤類型:
'Microsoft VBScript 編譯器錯誤 (0x800A0414)
'調用子程序時不能使用括號
'/XML/fc1.ASP, line 9, column 12
'obj.Add(3,4)
'下面是正確寫法
dim c
c=obj.Add(3,4)
Response.Write c
%>
</BODY>
</Html>
配置好虛擬目錄,在IE中執行此ASP文件,得到結果7
第一篇結束了,祝大家學習愉快。
ASP組件初級入門與精通系列之二
如何注冊組件
1.regsvr32 組件的絕對路徑
如:
程序代碼
regsvr32 c:\test\fc1.dll
因為組件只要注冊就可以使用了,所以與組件的位置無關。
2.在COM+組件管理器中注冊
什麼時候需要這種注冊:組件在使用了COM+的服務後需要注冊後才能正常的執行。如果該組件僅僅regsvr32注冊,仍然無法使用
如何使用組件
程序代碼
set obj=server.createobject(“工程名.類名”)
然後調用其方法屬性
如何卸載組件
1.regsvr32 組件的絕對路徑
如:
程序代碼
regsvr32 c:\test\fc1.dll /u
u參數反注冊組件
2.COM+組件管理器中刪除組件即可
ASP組件初級入門與精通系列之三
如何使用屬性
打開vb6,新建Activex Dll工程。工程名修改為fCom,類名修改為fC2
點擊菜單->工具->添加過程
我們在名稱內輸入myName,類型選擇屬性,范圍選擇公有,然後確定
再次操作:在名稱內輸入Age,類型選擇屬性,范圍選擇公有,然後確定
再次操作:在名稱內輸入peopleInfo,類型選擇函數,范圍選擇公有,然後確定即可
代碼如下:
程序代碼
Option Explicit
'保持屬性值的局部變量,只能在類中使用
PRivate mvarmyName As String
Private mvarAge As Integer
'Let寫屬性(Let屬性: 該過程給一個屬性賦值。)
Public Property Let Age(ByVal vData As Integer)
mvarAge = vData
End Property
'Get讀屬性(該過程獲取一個屬性的值。)
Public Property Get Age() As Integer
Age = mvarAge
End Property
Public Property Let myName(ByVal vData As String)
mvarmyName = vData
End Property
Public Property Get myName() As String
myName = mvarmyName
End Property
Public Function peopleInfo() As String
peopleInfo = "姓名: " & mvarmyName & " 年齡:" & mvarAge
End Function
Ok,一個簡單的組件就寫好了,點擊菜單->文件->生成fCom.dll文件
確定,在目錄下就會有fCom.dll文件
測試
打開visual interdev6.0,生成一個ASP文件,為什麼要使用interdev,因為它有代碼提示功能,與vb的ide環境一致,方便書寫
程序代碼
<%@ Language=VBScript %>
<Html>
<BODY>
<%
set obj=server.CreateObject("fCom.fC2")
dim c
'這裡調用的是組件的Let屬性
obj.myName ="龍卷風"
obj.Age =20
c=obj.peopleInfo()
Response.Write c
'這裡調用的是組件的Get屬性
Response.Write "<br>"
Response.Write obj.myName
Response.Write "<br>"
Response.Write obj.Age
%>
</BODY>
</Html>
配置好虛擬目錄,在IE中執行此ASP文件,得到結果如下:
姓名: 龍卷風 年齡:20
龍卷風
20
未完待續
ASP組件初級入門與精通系列之四
數組問題
數組在程序中使用的很多,而且比較容易出問題
我們通過小例子來看看
打開vb6,新建Activex Dll工程。工程名修改為fCom,類名修改為fC4
點擊菜單->工具->添加過程
我們在名稱內輸入AcceptArray1,類型選擇子程序,范圍選擇公有,然後確定
再次操作:在名稱內輸入AcceptArray2,類型選擇函數,范圍選擇公有,然後確定即可
程序代碼
'功能:傳遞數組地址到組件,使用ByRef關鍵字,並賦值返回
Public Sub AcceptArray1(ByRef varray As Variant) As Variant
varray(0) = "龍卷風"
varray(1) = "20"
End Sub
'功能:返回一個字符串數組
Public Function AcceptArray2() As Variant
Dim a(2) as Variant
a(0) = "龍卷風"
a(1) = "20"
AcceptArray2=a
End Function
Ok,一個組件就寫好了,點擊菜單->文件->生成fCom.dll文件
確定,在目錄下就會有fCom.dll文件
測試
打開visual interdev6.0,生成一個ASP文件
程序代碼
<%@ Language=VBScript %>
<Html>
<BODY>
<%
dim obj
set obj = server.createobject("fCom.fC4")
dim a(2)
'測試第一個組件方法
obj.AcceptArray1(a)
response.write a(0)
response.write "<br>"
response.write a(1)
response.write "<br>"
'測試第二個組件方法
dim b
b=obj.AcceptArray2()
for i=0 to ubound(b)
Response.Write b(i)
response.write "<br>"
next
%>
</BODY>
</Html>
配置好虛擬目錄,在IE中執行此ASP文件,得到結果如下:
龍卷風
20
龍卷風
20
總結一下:
字符串,數字通過值傳遞或者作為返回值被返回
如果使用引用傳遞,將參數的類型設為Variant。這樣做可以避免一些錯誤。不過盡可能的減少引用傳遞參數
未完待續
ASP組件初級入門與精通系列之五
經常我們可以看到在連接數據庫,打開記錄集的時候,如下:
程序代碼
rs.Open strsql, conn,adOpenDynamic ,adLockPessimistic
在鍵入”,”的時候,後面會出現一個游標類型或者鎖類型列表可以供選擇。
有時候我們為了簡化,直接rs.open strsql,conn,1,3
第一種方法是不是更加專業一些,我們來看看ASP中如何實現
打開vb6,新建Activex Dll工程。工程名修改為fCom,類名修改為fC5
程序代碼
Option Explicit
'定義枚舉類型
Public Enum Interfacedig
icfirst = 1
icsecond = 2
icthree = 3
icfour = 4
icfive = 5
icsix = 6
icserven = 7
iceight = 8
End Enum
'定義函數
Public Function CallDat(ByVal idig As Integer, ByVal ics As Interfacedig) As Variant
CallDat = idig * ics
End Function
Ok,一個組件就寫好了,點擊菜單->文件->生成fCom.dll文件
確定,在目錄下就會有fCom.dll文件
測試
打開visual interdev6.0,生成一個ASP文件
程序代碼
<%@ Language=VBScript %>
<Html>
<BODY>
<%
'定義,還可以把這一部分放到一個文件中,就像ado的記錄集<!--#include file="adovbs.inc"-->
const icfirst = 1
const icsecond = 2
const icthree = 3
const icfour = 4
const icfive = 5
const icsix = 6
const icserven = 7
const iceight = 8
set obj=server.CreateObject("fCom.fc5")
'這裡可以使用iceight或者8,但是前者使代碼具有更好的可讀性
a= obj.CallDat(4,iceight)
Response.Write a
Response.Write "<br>"
a= obj.CallDat(4,8)
Response.Write a
%>
<P> </P>
</BODY>
</Html>
配置好虛擬目錄,在IE中執行此ASP文件,得到結果如下:
32
32
ASP組件初級入門與精通系列之六
錯誤處理
如果頁面出錯,而沒有對錯誤的處理,那麼頁面會顯示一個用戶可能看不懂的錯誤。
在ASP腳本中可以使用
程序代碼
On Error Resume Next
……
if Err.Number<>0 then
Response.Write Err.Description
End if
但是如果組件中出錯呢?這種方法可以捕獲錯誤,但是具體的錯誤如何知道呢?
我們可以在組件中加入錯誤處理,來返回錯誤,這樣可以容易的看到更加詳細的出錯信息,有助於我們排除錯誤。
使用Err.Raise, Raise 被用來生成運行時錯誤
打開vb6,新建Activex Dll工程。工程名修改為fCom,類名修改為fC6
程序代碼
Option Explicit
Public Sub showerror1()
On Error GoTo ErrorHandle
Dim i As Double
i = 1 / 0
ErrorHandle:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
'生成自定義的錯誤
Public Sub showerror2()
Err.Raise 600, "自己定義的錯誤600", "這是描述自己程序的錯誤"
End Sub
Ok,一個組件就寫好了,點擊菜單->文件->生成fCom.dll文件
確定,在目錄下就會有fCom.dll文件
測試
打開visual interdev6.0,生成一個ASP文件
程序代碼
<%@ Language=VBScript %>
<Html>
<BODY>
<%
'下面這一句很重要
on error resume next
set obj=server.CreateObject("fCom.fc6")
obj.showerror1()
'如果沒有錯誤處理,就會產生一個出錯的界面,很不專業
'從 0–512 的范圍保留為系統錯誤;從 513–65535 的范圍可以用做用戶定義的錯誤。
'如果是保留錯誤,那麼組件內錯誤號和頁面處理的錯誤號是相一致的
if err.number <>0 then
Response.Write "錯誤信息" & err.number & err.Description
end if
Response.Write "<br>"
'如果是用戶定義的錯誤,那麼在頁面中可以分別進行處理
obj.showerror2()
if err.number<>0 then
if err.number =600 then
Response.Write err.number & err.Source & err.Description
end if
end if
%>
</BODY>
</Html>
配置好虛擬目錄,在IE中執行此ASP文件,得到結果如下:
錯誤信息11除數為零
600自己定義的錯誤600這是描述自己程序的錯誤
ASP組件初級入門與精通系列之七
在運行前幾章的例子,可能或多或少的都會碰上一些問題
如:組件編譯後,又要修改,發生”權限被拒絕,’f:\csdn\fcom.dll’”等等的錯誤。
當ASP頁面浏覽時,打開任務管理器,會看到一個dllhost.exe,用戶名為IWAM_YANG的進程。IWAM_YANG會根據計算機名而有所不同。
可以使用以下幾種方式來解決
1. 重新啟動IIS.
在控制面板中找到管理工具->internet信息服務->右鍵點擊左邊樹圖第二層本地計算機->所有任務->重新啟動IIS即可,這個操作需要一點時間。
此時你可以看到這個dllhost.exe的進程已經關閉
2. 上面這種方法的缺點就是當前所有的網站都被關閉直到重新啟動
有沒有針對單個網站或者虛擬目錄的?有
在控制面板中找到管理工具->internet信息服務->找到你的組件運行的虛擬目錄。->右鍵屬性->第一項虛擬目錄中->應用程序保護->點擊卸載即可。
此時你可以看到這個dllhost.exe的進程已經關閉
3. 如果你覺得麻煩,直接在Windows任務管理器中結束該進程既可
4. 最後一種方法
在控制面板中找到管理工具->組件服務->在樹圖中點擊計算機,我的電腦,正在運行的進程->IIS Out-Of-Process Pooled applications(2860)->右鍵關閉即可
此時你可以看到這個dllhost.exe的進程已經關閉。