一、 组件编写速成——编写组件最基本的步骤
本部分主要讲解编写组件的基本步骤,如果你有进一步学习的欲望,请参照vb6.0帮助文档中“创建 activex dll”部分(msdn library中文档文件名为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服务器中,并用“regsvr32.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。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




