在前面的内容中,我们
学习了
组件的使用,网上的
组件虽然不少,但往往小小的一个
组件就要你掏出美元来,而国产的
组件又太少,想掏点人民币还没地儿好掏,算了,您干脆自己写吧,其实编写
组件并不难,无非是刚开始写低水平的
组件,慢慢开始写高水平的
组件而已。要编写ActiveX Server Components,有多种
工具可供选择:Visual Basic、C++、Java等等,这里选择最简单的VB6.0,只要你以前用过VB,包你不到1小时之内,做一个小
组件出来。
一、
组件编写速成——编写
组件最基本的步骤
本部分主要讲解编写
组件的基本步骤,如果你有进一步
学习的欲望,请参照VB6.0帮助
文档中“创建 ActiveX DLL”部分(MSDN Lib
rary中文档文件名为Vbcon98.chm)。
目的:编写一个最简单的加法器
组件,这个
组件有两个属性,一个方法。我们从最熟悉的地方开始,那就是先假设这个
组件已经存在,看看在ASP使用该
组件的代码:
<%
Dim objSum
‘ 先创建该
组件,
组件标识为 TestDll.Sum
Set objSum = Server.CreateObject("TestDll.Sum")
‘ 记住TestDll.Sum 中的“TestDll”,“Sum”。
objSum.augend = 10.52 ‘augend 属性为被加数
objSum.addend = 382.41 ‘addend 属性为加数
Result = objSum.Plus ‘Plus 方法求和
Response.Write Result
Set objSum = Nothing
%>
请务必记住这几个关键词:TestDll、Sum、augend、addend、Plus,这将与接下来的工作紧密关联。下面是详细步骤:
1. 运行VB6.0,在“文件”菜单中,单击“新建工程”→在“新建工程”对话框中,双击“ActiveX DLL”图标→Visual Basic 将向该新工程中自动添加一个类模块 Class1(在“工程资源管理器”中可以看到,如图1)。
2.按 F4 键打开“属性”窗口。双击“名称”属性把“Class1”改成 Sum。
3.在“工程”菜单中,单击“工程1 属性”打开“工程属性”对话框。在“工程名称”中填写TestDll,在“工程描述”中填写“创建ActiveX DLL示例”。如图2。
提示:ASP创建
组件中的标识TestDLL.Sum这两项的意思明白了吧。
4.在“文件”菜单中,单击“保存工程”,分别使用下面的名称保存工程文件:SetupDll.cls和SetupDll.vbp。
5.为 Sum 类创建属性:
(1) 在“工具”菜单中,选择“添加过程”打开“添加过程”对话框。在“名称”框中,输入augend,单击“属性”,然后单击“确定”,如图3(注意:当前焦点应在代码窗口,否则“添加过程”菜单无效)。
(2) 在“工具”菜单中,选择“添加过程”打开“添加过程”对话框。在“名称”框中,输入addend,单击“属性”,然后单击“确定”。
6.为 Sum 类创建方法:
在“工具”菜单中,单击“添加过程”打开“添加过程”对话框。在“名称”框中,输入Plus,在类型中,你可以选择“子程序”或“函数”,本例中由于要返回加数与被加数之和,故单击“函数”,然后单击“确定”。
现在,前面ASP代码中的五个关键词语都已用上,这下很多东西都明白了吧。
7.类模块Sum代码窗口中所有代码如下:
Option Explicit
Private mdbl_augend As Double
Private mdbl_addend As Double
Public Property Get augend() As Double
augend = mdbl_augend
End Property
Public Property Let augend(ByVal vNewValue As Double)
mdbl_augend = vNewValue
End Property
Public Property Get addend() As Double
addend = mdbl_addend
End Property
Public Property Let addend(ByVal vNewValue As Double)
mdbl_addend = vNewValue
End Property
Public Function Plus()
Plus = augend + addend
End Function
你已经注意到以上代码与系统生成的代码有点不同,主要是Public Property Get augend() As Variant部分用实际的数据类型Double替代了。
注意:实际上,当执行 x = objSum.augend 语句时,调用的是 Property Get 过程,获取mdbl_augend的值,而执行 objSum.augend = 10.52 语句时,将调用 Property Let 过程,将10.52赋给 mdbl_augend。
8.最后一步,在“文件”菜单中,单击“生成.Dll(K)…”,生成文件SetupDll.dll。
到这里,
组件已创建好了。现在,我们可以先在VB6中编写一个测试工程,测试一下该文件正确与否。
1.在“文件”菜单中,单击“新建工程” →双击“标准EXE”。
2.在“工程”菜单中,单击“引用” →在“引用”对话框中按“浏览”按钮,选择刚刚编译过的“SetupDll.dll”文件→单击“确定”。
3.最后在代码窗口中编写如下代码:
Option Explicit
Private Sub Form_Load()
Dim objSum As TestDll.Sum
Set objSum = New Sum
objSum.augend = 10.52
objSum.addend = 382.41
MsgBox objSum.Plus
End Sub
运行一下,结果正确,接下来我们在ASP中使用这个
组件。将SetupDll.dll拷到Web
服务器中,并用“Regs
VR32.exe setupdll.dll”命令注册该
组件,然后在
浏览器中执行本部分开头的ASP程序。如果不行的话,你可以尝试先用VB6的打包工具打包,然后再安装,
组件会自动注册,而且一些必需的VB6运行文件也会自动安装。
说明:本部分所有程序均在下载包的Setupdll.zip中。
上面的例子中我们使用属性过程Property Get和Property Let来添加属性(Property Get读取属性的值,而Property Let给属性赋值),若需要对设置的值进行校验,可在Property Let过程编写适当代码。如下面代码:
Public Property Let augend(ByVal vNewValue As Double)
If vNewValue < 100 Then
MsgBox "搞什么!小于100的值,自己心算就行了"
Else
mdbl_augend = vNewValue
End If
End Property
二、 给
组件添加属性和方法的其他途径
1.添加属性最简单的一种方法:添加公共变量,如上例最简单的代码如下:
Option Explicit
Public augend As Double ‘ 添加 augend 属性
Public addend As Double ‘ 添加 addend 属性
Public Function Plus() As Double
Plus = augend + addend
End Function
但是,该方法只能设置可读/写属性,且不能对所赋值进行校验。如果仅需添加只读属性:在上例中,删除Public Property Let augend(ByVal vNewValue As Double)过程,则augend便成了一只读属性,不能赋值。当然,若要添加只写属性,只需删除Property Get过程就可以了。
2.使用类生成器实用工具
VB6中还有一个添加属性和方法的工具:在“外接程序”菜单中,单击“外接程序管理器”,在跳出的外接程序管理器对话框中选择“VB Class Builder Utility”,并在加载行为中选择“加载/卸载”(如图4)。然后再在“外接程序”菜单中单击“类生成器实用工具”,您一看就会用。
三、 告诉你几个要注意的问题
1. 上面的例子是一个简单得不能再简单的
组件,比较实用的
组件一般都至少还有一个模块(Module)。
2. 如果不小心, Visual Basic 可产生“单线程”
组件。
也许最常见的一个陷阱就是使用了没有被
设计为在 ASP 下运行的
组件,如“单线程”
组件。因此,请确保在“项目属性”页的“通用”选项卡上将线程模块设置为“单元线程”。
3. 关于“类型不匹配”错误。
一个好的建议是最好声明 Out 参数为 Variant,注意上例中没有这样设置。
4. 关于全局变量的使用。
尽量避免在
组件中使用全局变量。在 Visual Basic 术语中,这表示在标准的 .BAS 模块中没有 Public 或 Global 变量。因为Global 变量并不是真正意义上的全局。每个线程都有自己的副本,如果几种方法恰好在同一线程中执行,它们将看到相同的变量;否则它们访问的是这些变量的不同副本。这意味着您可能给一个全局变量赋了值(在线程 A 中),但其另一个用户(在线程 B 中执行)看不到新值。其原因是 Visual Basic 内部使用“线程本地存储 (TLS)”来引用全局变量。这意味着每个线程都有自己的 Public 变量的副本,并且因为它存在多个副本,全局数据并不是真正“全局的”。也就是说,恰好在同一线程中运行的用户才会访问到同一个变量,不论他们是否期望如此。
最后顺便提一下,VB6.0引入了一种全新的Visual Basic应用程序:IIS应用程序。你可以象创建ActiveX DLL一样创建IIS应用程序,任何用Active Server Pages创建的应用程序都可以在VB
开发环境中创建,你可以用单个的VB应用程序完全替代所有的Active Server Pages。