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:testfc1.dll
因為組件只要註冊就可以使用了,所以與組件的位置無關。
2.在COM+元件管理員中註冊
什麼時候需要這種註冊:元件在使用了COM+的服務後需要註冊後才能正常的執行。如果該組件僅regsvr32註冊,則仍無法使用
如何使用組件
程式碼
set obj=server.createobject(“工程名.類別名稱”)
然後呼叫其方法屬性
如何卸載元件
1. regsvr32 組件的絕對路徑
如:
程式碼
regsvr32 c:testfc1.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:csdnfcom.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的進程已經關閉。