Jun
30
在运行前几章的例子,可能或多或少的都会碰上一些问题
如:组件编译后,又要修改,发生”权限被拒绝,’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的进程已经关闭
如:组件编译后,又要修改,发生”权限被拒绝,’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的进程已经关闭
Jun
30
错误处理
如果页面出错,而没有对错误的处理,那么页面会显示一个用户可能看不懂的错误。
在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脚本中可以使用
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这是描述自己程序的错误
Jun
30
经常我们可以看到在连接数据库,打开记录集的时候,如下:
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
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
Jun
30
数组问题
数组在程序中使用的很多,而且比较容易出问题
我们通过小例子来看看
打开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。这样做可以避免一些错误。不过尽可能的减少引用传递参数
未完待续
数组在程序中使用的很多,而且比较容易出问题
我们通过小例子来看看
打开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。这样做可以避免一些错误。不过尽可能的减少引用传递参数
未完待续
Jun
30
如何使用属性
打开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
未完待续
打开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
未完待续