程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> Asp組件初級入門與精通

Asp組件初級入門與精通

編輯:ASP技巧

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的進程已經關閉。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved