分页: 148/196 第一页 上页 143 144 145 146 147 148 149 150 151 152 下页 最后页 [ 显示模式: 摘要 | 列表 ]
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的进程已经关闭
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这是描述自己程序的错误
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
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。这样做可以避免一些错误。不过尽可能的减少引用传递参数
  

  未完待续
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


未完待续
分页: 148/196 第一页 上页 143 144 145 146 147 148 149 150 151 152 下页 最后页 [ 显示模式: 摘要 | 列表 ]