分享
 
 
 

ASP讲座之十:自己动手编写组件

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

在前面的内容中,我们学习了组件的使用,网上的组件虽然不少,但往往小小的一个组件就要你掏出美元来,而国产的组件又太少,想掏点人民币还没地儿好掏,算了,您干脆自己写吧,其实编写组件并不难,无非是刚开始写低水平的组件,慢慢开始写高水平的组件而已。要编写ActiveX Server Components,有多种工具可供选择:Visual Basic、C++、Java等等,这里选择最简单的VB6.0,只要你以前用过VB,包你不到1小时之内,做一个小组件出来。

一、 组件编写速成——编写组件最基本的步骤

本部分主要讲解编写组件的基本步骤,如果你有进一步学习的欲望,请参照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。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有