您的位置:首页 > 编程语言 > ASP

Asp组件初级入门与精通系列

2006-09-22 09:46 489 查看
 一直以来,想写一些组件方面的应用,这段时间终于可以写一点自己喜欢的东西。

希望大家通过这些教程学习后,可以随心所欲的写出自己的组件。

每篇文章可能没有关联,只是写一些组件编写过程中出现的问题。

欢迎大家批评指正

环境: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

如何注册组件

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+组件管理器中删除组件即可

如何使用属性

打开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>

数组问题

数组在程序中使用的很多,而且比较容易出问题

我们通过小例子来看看

打开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。这样做可以避免一些错误。不过尽可能的减少引用传递参数

经常我们可以看到在连接数据库,打开记录集的时候,如下:

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脚本中可以使用

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这是描述自己程序的错误

在运行前几章的例子,可能或多或少的都会碰上一些问题

如:组件编译后,又要修改,发生”权限被拒绝,’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的进程已经关闭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息