本篇文章通过与传统的设计方法相比较,介绍了如何在ASP代码中调用VB组件的方法。在本篇文章中,我们假设读者具有VB和ASP的相关入门知识。
服务器端组件和客户端组件的比较
服务器端组件和客户端组件有许多不同之处。服务器端组件是在计算机服务器上注册的DLL文件,客户端组件则在浏览器运行的计算机上注册,在IE中,这些客户端组件被称作ActiveX浏览器插件组件。
ActiveX客户端组件可以使用VB编写,并通过 互联网或内联网发送给浏览器,生成很精彩的效果。问题是,ActiveX客户端组件只限于IE,而使用VB编写的服务器端组件则能够产生纯HTML代码,适用于所有的浏览器。服务器端组件的最大问题是该组件必须在 Windows+IIS环境中或与IIS的API兼容的应用中运行。相比较而言,在服务器端实现这种兼容性似乎更容易一些。
IIS服务器端组件驻留在与IIS相同的内存空间中,并随时准备服务器上处理的ASP网页的调用。从理论上说,我们可以在返回浏览器的ASP代码中插入任何文本或代码,但一般来说,大多数服务器端组件被用来处理需要大量时间的计算或数据库信息查找,然后将所得到的结果以HTML代码的形势返回给浏览器。
VB组件的解析
由于本篇文章旨在讨论编写VB组件的基本方法,因此在能够说明问题的情况下,其中的例子将是十分简单的。在详细讨论编写VB组件之前,我们将首先从概念上对VB组件作一番剖析。
在使用VB编写服务器端的组件时,有三个分层次的概念(在VB和ASP代码中都会用到)需要注意:
·Project名字
·Class名字
·Method名字
VB工程的名字就是Project名字。许多开发人员都将Project名字看作是组件名字,但VB只将它看作是工程的名字。在我们的例子中,Project名字是ExampleProject,当然了,我们可以随意命名自己的工程名字;Class名字名字是ExampleClass,Method名字是ExampleMethod。
工程名字(组件名字)也可以是由组件代码编译后得到的DLL文件的名字,该DLL文件将包含有被IIS用来向浏览器返回文本或HTML代码的经过编译的VB代码。
方法名字指的是管理特定代码功能的VB代码部分,例如计算日期或显示数据库中所有作者的清单。组件方法有点角个黑盒子,它完成特定的工作或根据输入的信息返回特定的信息。一般情况下,在一个组件中可以有多个方法。为了更有效地管理组件的方法,可以将方法按照相似的分类组合在一起,这就是组件类的作用。
组件类能够在内存中生成组件类代码的一个拷贝,在使用ASP代码创建对象时,它也被称作对象,这就是实例化。一旦有了组件类代码实例的对象引用,我们就可以从ASP代码中调用类中包含的方法。
在我们的例子中,工程、类、方法的名字将用来在ASP代码中实例化VB组件,并以方法参数的形式从ASP代码中向VB代码传送值,在ASP代码中接收从VB方法中返回的值。
从ASP文件中调用VB组件
我们用来调用VB组件的ASP文件将使用对象变量保存VB对象的引用。在ASP文件中,可以使用ASP Server对象的CreateObject()方法创建一个对象,该方法将返回一个它创建的对象的引用。在例子中,我们将使用objReference作为组件的对象变量。下面的代码显示ASP代码在实例化VB组件时需要使用组件的工程名和类名(ExampleProject和ExampleClass)。
实例化VB组件的ASP代码:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
VB组件将从ASP代码中接受3个变量的值,并向ASP代码返回一个值,该值将 存储在名字为strMethodReturn的ASP变量中。下面的代码显示出ASP代码是如何得到由VB组件返回的值的,它向VB方法传送三个名字分别为Param1、Param2和Parma3的三个参数值:
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
Param1、Param2、Param3这三个参数必须与VB组件中方法的定义完全相同,下面是二行实例化VB组件的类、并调用类的方法获得返回值的ASP代码的例子:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
下面的图表直观地显示了VB组件的工程、类和方法名字是如何与ASP文件中的组件实例化代码协调的。在逐步地学习如何编写例子中的VB代码和ASP文件时,可以将下面的图表作为参考。
VB方法的作用
我们例子中简单的VB组件将获得用户的名字和年龄,然后返回一个以天计的用户的年龄,而且有一个可选项,能够提醒某个用户是否已经超过了45岁。
如果我们向组件传送一个虚构的Eric Clapton作为方法的第一个参数值,将第二个参数设置为56,我们将得到下面的返回字符串:
Eric Clapton is over 20440 days old.
如果我们将可选的第三个参数设置为True(这一参数将使方法判断用户是否已经超过45岁),我们将会得到下面的返回字符串:
Eric Clapton is over 20440 days OLD.
由于使用了三个完全不同的变量━━用户的姓名、年龄以及表示他们是否超过了45岁,因此我们需要使用三个方法参数将这些信息从ASP文件传送给VB代码。在VB中,考虑要使用哪些数据类型是十分重要的。我们将使用一个名字为strName的字符串型变量表示用户的姓名,名字为intAge的整型变量表示用户的年龄,名字为blnAgeEmphasisOn的布尔型变量表明用户是否已经超过了45岁。
三个方法参数(传送给VB组件的方法代码的变量):
在VB中创建服务器端组件
启动VB后,在“新工程”窗口中双击“ActiveX DLL”图标。一旦VB加载了新的ActiveX DLL工程,至少会看到二个打开的窗口:工程窗口和属性窗口。如果有一个窗口显示不出来,可以从VB的菜单中选择“查看”菜单项(分别使用“查看”->“工程管理器”、“查看”->“属性窗口”)。
由于VB对第一个工程和类的缺省命名分别是Project1、Class1,我们可以将它们分别改为ExampleProject 和ExampleClass。工程名字的修改可以在工程窗口中进行。在工程窗口中新输入的工程名字左侧有一个带有+或-的小方框。如果显示的是+号,选择该小方框,+号就会变成-号,缺省的类名(Class1)就会显示在工程名字的下面。在工程窗口中选择缺省的类名,在属性窗口中将缺省的类名修改为ExampleClass。
在保存工程时,VB会将包含类的代码保存在一个扩展名为CLS的文件,工程文件的扩展名为VBP,其中 存储有工程的各种设置、文件名和文件存储的位置。
服务器端组件的属性值
在属性窗口中显示ExampleClass类的属性,注意Instancing属性的值为“5 MultiUse”,如果将工程的类型设置为标准的EXE工程,该属性的值就会随之发生改变。
在VB的菜单中选择“工程”->“ExampleProject属性”,就会显示出工程属性窗口。在“常规”标签的右下端的“线程模式”属性的值应当被设置为“单元线程”,这将使多个访问者能够同时使用我们的组件类的不同的实例。另外,选择“无人值守执行”和“驻留内存”二个选项,避免VB6中的内存泄露问题。
VB方法的代码
现在我们就需要使用VB的代码窗口来输入VB代码了。如果代码窗口还是一片空白,那就输入下面的代码好了:
Option Explicit
'它将要求我们必须定义所有的变量。
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在上面的代码中,我们将方法定义成了一个Public函数,这意味着该组件之外的任何代码都能够调用它,由于是一个函数,它还会向调用它的代码返回一个值。
Public Function ExampleMethod() As String
上面的代码表示ExampleMethod()函数将向它的调用者返回一个字符串类型的值。
我们的VB方法带有3个从ASP代码接受值的参数变量,最后一个参数变量是可选的。所有用来从VB组件之外接收值的参数变量都需要在VB方法的括号间定义和使用,我们可以象在方法内定义的变量那样使用以这种方式定义为方法参数的变量,二者之间唯一的区别是外面的ASP代码来决定它们的值。
下面是三个变量和它们的数据类型:
ByVal strName As String
ByVal intAge As Integer
Optional ByVal blnAgeEmphasisOn As Boolean = False
上面的代码定义了三个方法参数的数据类型,指明它们是按值传送的,而且第三个参数是可选的,如果没有第三个参数,则其缺省值为False。
然后,我们将在方法的定义中添加一些必要的逗号、空格和底划线(_),这样才能符合VB的语法要求。我们将把参数列表放在方法定义的括号中间,得到的方法定义如下:
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在VB的代码窗口输入上面的方法定义,就会生成一个End Function语句。方法的定义和End Function之间就是我们编写自己的代码的地方了。
服务器端组件和客户端组件的比较
服务器端组件和客户端组件有许多不同之处。服务器端组件是在计算机服务器上注册的DLL文件,客户端组件则在浏览器运行的计算机上注册,在IE中,这些客户端组件被称作ActiveX浏览器插件组件。
ActiveX客户端组件可以使用VB编写,并通过 互联网或内联网发送给浏览器,生成很精彩的效果。问题是,ActiveX客户端组件只限于IE,而使用VB编写的服务器端组件则能够产生纯HTML代码,适用于所有的浏览器。服务器端组件的最大问题是该组件必须在 Windows+IIS环境中或与IIS的API兼容的应用中运行。相比较而言,在服务器端实现这种兼容性似乎更容易一些。
IIS服务器端组件驻留在与IIS相同的内存空间中,并随时准备服务器上处理的ASP网页的调用。从理论上说,我们可以在返回浏览器的ASP代码中插入任何文本或代码,但一般来说,大多数服务器端组件被用来处理需要大量时间的计算或数据库信息查找,然后将所得到的结果以HTML代码的形势返回给浏览器。
VB组件的解析
由于本篇文章旨在讨论编写VB组件的基本方法,因此在能够说明问题的情况下,其中的例子将是十分简单的。在详细讨论编写VB组件之前,我们将首先从概念上对VB组件作一番剖析。
在使用VB编写服务器端的组件时,有三个分层次的概念(在VB和ASP代码中都会用到)需要注意:
·Project名字
·Class名字
·Method名字
VB工程的名字就是Project名字。许多开发人员都将Project名字看作是组件名字,但VB只将它看作是工程的名字。在我们的例子中,Project名字是ExampleProject,当然了,我们可以随意命名自己的工程名字;Class名字名字是ExampleClass,Method名字是ExampleMethod。
工程名字(组件名字)也可以是由组件代码编译后得到的DLL文件的名字,该DLL文件将包含有被IIS用来向浏览器返回文本或HTML代码的经过编译的VB代码。
方法名字指的是管理特定代码功能的VB代码部分,例如计算日期或显示数据库中所有作者的清单。组件方法有点角个黑盒子,它完成特定的工作或根据输入的信息返回特定的信息。一般情况下,在一个组件中可以有多个方法。为了更有效地管理组件的方法,可以将方法按照相似的分类组合在一起,这就是组件类的作用。
组件类能够在内存中生成组件类代码的一个拷贝,在使用ASP代码创建对象时,它也被称作对象,这就是实例化。一旦有了组件类代码实例的对象引用,我们就可以从ASP代码中调用类中包含的方法。
在我们的例子中,工程、类、方法的名字将用来在ASP代码中实例化VB组件,并以方法参数的形式从ASP代码中向VB代码传送值,在ASP代码中接收从VB方法中返回的值。
从ASP文件中调用VB组件
我们用来调用VB组件的ASP文件将使用对象变量保存VB对象的引用。在ASP文件中,可以使用ASP Server对象的CreateObject()方法创建一个对象,该方法将返回一个它创建的对象的引用。在例子中,我们将使用objReference作为组件的对象变量。下面的代码显示ASP代码在实例化VB组件时需要使用组件的工程名和类名(ExampleProject和ExampleClass)。
实例化VB组件的ASP代码:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
VB组件将从ASP代码中接受3个变量的值,并向ASP代码返回一个值,该值将 存储在名字为strMethodReturn的ASP变量中。下面的代码显示出ASP代码是如何得到由VB组件返回的值的,它向VB方法传送三个名字分别为Param1、Param2和Parma3的三个参数值:
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
Param1、Param2、Param3这三个参数必须与VB组件中方法的定义完全相同,下面是二行实例化VB组件的类、并调用类的方法获得返回值的ASP代码的例子:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
下面的图表直观地显示了VB组件的工程、类和方法名字是如何与ASP文件中的组件实例化代码协调的。在逐步地学习如何编写例子中的VB代码和ASP文件时,可以将下面的图表作为参考。
![](http://desktop.chinaitlab.com/UploadFiles_2993/200704/20070404143051768.gif)
VB方法的作用
我们例子中简单的VB组件将获得用户的名字和年龄,然后返回一个以天计的用户的年龄,而且有一个可选项,能够提醒某个用户是否已经超过了45岁。
如果我们向组件传送一个虚构的Eric Clapton作为方法的第一个参数值,将第二个参数设置为56,我们将得到下面的返回字符串:
Eric Clapton is over 20440 days old.
如果我们将可选的第三个参数设置为True(这一参数将使方法判断用户是否已经超过45岁),我们将会得到下面的返回字符串:
Eric Clapton is over 20440 days OLD.
由于使用了三个完全不同的变量━━用户的姓名、年龄以及表示他们是否超过了45岁,因此我们需要使用三个方法参数将这些信息从ASP文件传送给VB代码。在VB中,考虑要使用哪些数据类型是十分重要的。我们将使用一个名字为strName的字符串型变量表示用户的姓名,名字为intAge的整型变量表示用户的年龄,名字为blnAgeEmphasisOn的布尔型变量表明用户是否已经超过了45岁。
三个方法参数(传送给VB组件的方法代码的变量):
![](http://desktop.chinaitlab.com/UploadFiles_2993/200704/20070404143102980.gif)
在VB中创建服务器端组件
启动VB后,在“新工程”窗口中双击“ActiveX DLL”图标。一旦VB加载了新的ActiveX DLL工程,至少会看到二个打开的窗口:工程窗口和属性窗口。如果有一个窗口显示不出来,可以从VB的菜单中选择“查看”菜单项(分别使用“查看”->“工程管理器”、“查看”->“属性窗口”)。
由于VB对第一个工程和类的缺省命名分别是Project1、Class1,我们可以将它们分别改为ExampleProject 和ExampleClass。工程名字的修改可以在工程窗口中进行。在工程窗口中新输入的工程名字左侧有一个带有+或-的小方框。如果显示的是+号,选择该小方框,+号就会变成-号,缺省的类名(Class1)就会显示在工程名字的下面。在工程窗口中选择缺省的类名,在属性窗口中将缺省的类名修改为ExampleClass。
在保存工程时,VB会将包含类的代码保存在一个扩展名为CLS的文件,工程文件的扩展名为VBP,其中 存储有工程的各种设置、文件名和文件存储的位置。
服务器端组件的属性值
在属性窗口中显示ExampleClass类的属性,注意Instancing属性的值为“5 MultiUse”,如果将工程的类型设置为标准的EXE工程,该属性的值就会随之发生改变。
在VB的菜单中选择“工程”->“ExampleProject属性”,就会显示出工程属性窗口。在“常规”标签的右下端的“线程模式”属性的值应当被设置为“单元线程”,这将使多个访问者能够同时使用我们的组件类的不同的实例。另外,选择“无人值守执行”和“驻留内存”二个选项,避免VB6中的内存泄露问题。
VB方法的代码
现在我们就需要使用VB的代码窗口来输入VB代码了。如果代码窗口还是一片空白,那就输入下面的代码好了:
Option Explicit
'它将要求我们必须定义所有的变量。
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在上面的代码中,我们将方法定义成了一个Public函数,这意味着该组件之外的任何代码都能够调用它,由于是一个函数,它还会向调用它的代码返回一个值。
Public Function ExampleMethod() As String
上面的代码表示ExampleMethod()函数将向它的调用者返回一个字符串类型的值。
我们的VB方法带有3个从ASP代码接受值的参数变量,最后一个参数变量是可选的。所有用来从VB组件之外接收值的参数变量都需要在VB方法的括号间定义和使用,我们可以象在方法内定义的变量那样使用以这种方式定义为方法参数的变量,二者之间唯一的区别是外面的ASP代码来决定它们的值。
下面是三个变量和它们的数据类型:
ByVal strName As String
ByVal intAge As Integer
Optional ByVal blnAgeEmphasisOn As Boolean = False
上面的代码定义了三个方法参数的数据类型,指明它们是按值传送的,而且第三个参数是可选的,如果没有第三个参数,则其缺省值为False。
然后,我们将在方法的定义中添加一些必要的逗号、空格和底划线(_),这样才能符合VB的语法要求。我们将把参数列表放在方法定义的括号中间,得到的方法定义如下:
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在VB的代码窗口输入上面的方法定义,就会生成一个End Function语句。方法的定义和End Function之间就是我们编写自己的代码的地方了。