[转]在ASP网页中使用COM组件-创建Visual Basic COM 对象
作者:cmscn 日期:2009-08-13
在本课中,您将使用 Visual Basic 创建简单的 COM 对象,此对象可以从 ASP 网页中进行调用。本示例需要 Visual Basic 带有 ActiveX 向导,64 位的平台不支持本示例,除非此 Visual Basic Runtime 是为 64 位平台开发的。您可以创建运行在 64 位平台上的 32 位 COM 对象,但必须从 32 位应用程序调用这个 32 位 COM 对象。因为 IIS 是 64 位平台上的 64 位应用程序,它无法调用 32 位对象。
假定您需要创建一个 Web 应用程序,而此应用程序需要的功能 VBScript 却不具备。此时,必须创建一个自定义过程,并且需要时能从应用程序中的任何 ASP 网页进行调用。
通常,这种解决方案对于封装自定义功能是足够的。然而,您可能要创建一个为数千用户提供服务的 Web 应用程序,而您的过程封装了不希望其他人看到的私有函数。此时,将功能封装为 COM 组件的形式应当是首选方案。组件提供的安全性和性能比脚本更高,因为它们是已编译的代码。组件还允许您使用由 Visual Basic、C++、Java 或其他兼容 COM 的语言提供的功能。
创建 ActiveX COM 对象
Visual Basic 的 ActiveX DLL 向导是创建 COM 组件最简便的方法。您也可以使用 Microsoft Visual C++ 创建 COM 组件,方法是通过 Active Template Library (ATL) 或自己编写全部代码,本示例使用 Visual Basic。
在本课程中,您将学习如何创建一个 Visual Basic 函数,并将其封装为组件。Visual Basic 包含许多不能用于 VBScript 的财务函数。本示例根据固定的利率以及定期、固定的付款来计算一笔投资的未来价值。
打开 Visual Basic。如果未出现标题为“新建工程”的窗口,请选择“文件”,然后单击“新建工程”。
选择“ActiveX DLL”,单击“确定”。
将打开一个名为“工程1 - Class1 (Code)”的窗口。可以在此处输入代码。
在“工程”菜单中,单击“工程1 属性”。在“通用”属性页的“工程名称”框中,键入 ASPTut。您的 DLL 称为 ASPTut.dll。选中“执行无用户界面”复选框,这样工程就可以在没有用户交互的情况下运行,并且不出现用户界面元素。请确认“线程模型”为“单元线程”,这样,多个用户就可以同时访问 DLL。单击“确定”。
在 Visual Basic 中,定义一个类,将方法和属性组合在一起。在“工程 - ASPTut”窗口之下,单击“Class1 (Class1)”节点,列出类的属性。在“属性 - Class1”之下,在“(名称)”旁边的文本字段中单击,并将类名称更改为 Finance。当您在 ASP 网页或其他脚本中调用此 COM 组件时,需要使用 ASPTut.Finance 对其进行引用。单击“Instancing”旁边的下拉菜单,并选择“5 - MultiUse”。
了解一下将要使用的 Visual Basic 函数。可在 MSDN 上的 Visual Basic 库中找到有关 FV 函数的信息。
刚才标题为“工程1 - Class1 (Code)”的窗口的标题现在更改为 ASPTut - Finance (Code)。将下列文本复制并粘贴到此窗口中:
Option Explicit
'声明将由 Property 函数设置的全局变量。
Dim gAnnualIntRate As Double
Dim gNumPayPeriods As Integer
Dim gPayment As Double
Dim gPresentSavings As Variant '可选
Dim gWhenDue As Variant '可选
Public Function CalcFutureValue() As Double
'用户在 ASP 网页中设置属性时,
'也就设置了要传递给 FV 函数的全局变量。
'如果想避免使用属性,
'可以将变量传递给 CalcFutureValue() 函数。
'CalcFutureValue 将成为组件中的一种方法。
Dim IntRatePerPeriod As Double
Dim FullFutureValue As Double
If (gAnnualIntRate = Null) or (gNumPayPeriods = Null) or (gPayment = Null) Then
CalcFutureValue = 0
Else
IntRatePerPeriod = gAnnualIntRate / 100 / 12
FullFutureValue = FV(IntRatePerPeriod, gNumPayPeriods, gPayment, gPresentSavings, gWhenDue)
CalcFutureValue = Round(FullFutureValue, 2)
End If
End Function
Public Property Get AnnualIntRate() As Double
'Get 函数以类似属性的形式
'返回全局变量的值。
'在 ASP 网页中,可以表述为 x = oASPTut.Rate。
AnnualIntRate = gAnnualIntRate
End Property
Public Property Let AnnualIntRate(ByVal vAnnualIntRate As Double)
'Let 函数在 ASP 网页进行调用(例如 oASPTut.Rate = 5)时
'设置全局变量
gAnnualIntRate = vAnnualIntRate
End Property
Public Property Get NumPayPeriods() As Integer
NumPayPeriods = gNumPayPeriods
End Property
Public Property Let NumPayPeriods(ByVal vNumPayPeriods As Integer)
gNumPayPeriods = vNumPayPeriods
End Property
Public Property Get Payment() As Double
Payment = gPayment
End Property
Public Property Let Payment(ByVal vPayment As Double)
gPayment = -(vPayment)
End Property
Public Property Get PresentSavings() As Variant
PresentSavings = gPresentSavings
End Property
Public Property Let PresentSavings(ByVal vPresentSavings As Variant)
gPresentSavings = -(vPresentSavings)
End Property
Public Property Get WhenDue() As Variant
WhenDue = gWhenDue
End Property
Public Property Let WhenDue(ByVal vWhenDue As Variant)
gWhenDue = vWhenDue
End Property
所有服务器组件都需要一个入口(起始)点。所谓入口点就是使用 Server.CreateObject 初次设置对象实例时要调用的代码。首次调用 ASPTut 组件时,无需进行任何特殊操作。因此,您可以提供一个空的 Sub Main 过程。在“工程”菜单中选择“添加模块”。在“添加模块”窗口中的“新建”选项卡之下,选择“模块”图标并单击“打开”。在“Module 1”代码窗口中,键入 Sub Main 并按 Enter 键。这样即创建了一个空的子过程。
将 Sub Main 模块保存为 Main.bas。将类文件保存为 Finance.cls。将工程保存为 ASPTut.vbp。
单击“文件”,再单击“生成 ASPTut.dll”。这将编译并注册 ASPTut.dll。从 ASP 网页调用 ASPTut.dll 之后,除非卸载运行 ASP 文件的应用程序,否则将不能再在 Visual Basic 中生成 DLL。卸载方法之一是使用 Internet 信息服务管理单元打开默认网站的属性,再单击“卸载”按钮。如果需要在另一个 Web 服务器上注册此 DLL,请将 ASPTut.dll 复制到此服务器,再单击“开始”,单击“运行”,然后在“打开”文本框中键入 cmd。在 ASPTut.dll 所在的目录中,键入 regsvr32 ASPTut.dll。
退出 Visual Basic。
创建一个使用 Visual Basic COM 对象的 ASP 网页
本示例中的 ASP 网页使用表单读取用户数据,创建一个对象实例,并计算储蓄计划的未来价值。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 CalculateFutureValue.asp。通过在浏览器的地址栏中键入 http://localhost/Tutorial/CalculateFutureValue.asp,可以在浏览器中查看此示例的效果。
<%@ Language=VBScript %>
<%
Response.Expires = 0
Payment = Request.Form("Payment")
AnnualIntRate = Request.Form("AnnualIntRate")
NumPayPeriods = Request.Form("NumPayPeriods")
WhenDue = Request.Form("WhenDue")
PresentSavings = Request.Form("PresentSavings")
%>
<HTML>
<HEAD><TITLE>计算未来价值</TITLE></HEAD>
<BODY>
<FONT FACE="MS Gothic">
<H2 align=center>计算储蓄计划的未来价值</H2>
<FORM METHOD=POST ACTION="calculatefuturevalue.asp">
<TABLE cellpadding=4 align=center>
<TR>
<TD>每月计划存入多少钱?</TD>
<TD><INPUT TYPE=TEXT NAME=Payment VALUE=<%=Payment%>> (必填)</TD>
</TR><TR>
<TD>请输入年利率。</TD>
<TD><INPUT TYPE=TEXT NAME=AnnualIntRate VALUE=<%=AnnualIntRate%>> (必填)</TD>
</TR><TR>
<TD>您要存几个月?</TD>
<TD><INPUT TYPE=TEXT NAME=NumPayPeriods VALUE=<%=NumPayPeriods%>> (必填)</TD>
</TR><TR>
<TD>您将在每月的何时付款?</TD>
<TD><INPUT TYPE=RADIO NAME=WhenDue VALUE=1 <%If 1=WhenDue Then Response.Write"CHECKED"%>>月初
<INPUT TYPE=RADIO NAME=WhenDue VALUE=0 <%If 0=WhenDue Then Response.Write"CHECKED"%>>月末 </TD>
</TR><TR>
<TD>此储蓄帐号里现在有多少钱?</TD>
<TD><INPUT TYPE=TEXT NAME=PresentSavings VALUE=<%=PresentSavings%>> </TD>
</TR>
</TABLE>
<P align=center><INPUT TYPE=SUBMIT VALUE="计算未来价值">
</FORM>
<%
If ("" = Payment) or ("" = AnnualIntRate) or ("" = NumPayPeriods) Then
Response.Write "<H3 align=center>尚未输入有效值。</H3>"
ElseIf (IsNumeric(Payment)) And (IsNumeric(AnnualIntRate)) And (IsNumeric(NumPayPeriods)) Then
Dim FutureValue
Set oASPTut = Server.CreateObject("ASPTut.Finance")
oASPTut.AnnualIntRate = CDbl(AnnualIntRate)
oASPTut.NumPayPeriods = CInt(NumPayPeriods)
oASPTut.Payment = CDbl(Payment)
If Not "" = PresentSavings Then oASPTut.PresentSavings = CDbl(PresentSavings)
oASPTut.WhenDue = WhenDue
FutureValue = oASPTut.CalcFutureValue
Response.Write "<H3 align=center>未来价值 = $" & FutureValue & "</H3>"
Else
Response.Write "<H3 align=center>某些值不是数字。</H3>"
End If
%>
</FONT>
</BODY>
</HTML>
在浏览器中,您应看到下列结果:
评论: 0 | 引用: 0 | 查看次数: 519
发表评论