架起VB6与.Net的沟通桥梁

编程爱好者

对于VB程序员而言,最郁闷的事情莫过于眼睁睁看着.Net Framework丰富的功能与简便的实现,却受限于原有系统的开发语言,不得不继续使用VB6编写大量代码来完成原有系统的维护。然而,随着InteropForm的出现,所有郁闷的事情都结束了。

一、走近InteropForm

InteropForm工具集是微软新近推出的Visual Basic 2005 Power Packs的一部分,该工具集通过一个特殊的COM接口创建了一条在VB6中直接调用.Net中Com对象的属性、方法、事件的途径。借助这一途径,可以先在.Net平台上构建一个完整的功能应用,然后通过InteropForm生成Com对象,接着直接在VB6.0中调用,从而使VB程序员在维护原有系统时也能享受到.Net的巨大优势。

二、安装要点

在安装InteropForm工具集前,首先要确保运行的机器上同时安装VB6.0和VS 2005,接着直接运行下载的安装程序(下载地址:http://download.cpcw.com ),并依照向导的提示完成所有操作。

需要注意的是,安装完毕后第一次启动VS 2005时会出现一个错误信息,而且进入开发环境后,在工具菜单下也不会出现“Generate InteropForm Wrapper Class”,这主要是由InteropForm在中文操作系统上的一个Bug引起的,解决的办法如下:

在InteropForm的安装目录下找到Source.zip(默认路径C:\Program Files\Microsoft Visual Basic 2005 Power Packs\Interop Forms Toolkit 1.0\SDK\Source\),解压缩后,启动Microsoft.InteropFormTools.InteropFormProxyGenerator项目,打开其中的“Connect.vb”文件,找到“OnConnection”方法,将toolsMenuName = My.Resources.ResourceManager.GetString(toolsMenuNameKey)一句修改为toolsMenuName = “工具”,重新编译,然后将生成的文件复制到“C:\Program Files\Microsoft Visual Basic 2005 Power Packs\Interop Forms Toolkit 1.0\AddIn\”目录下覆盖同名文件。最后打开一个VS 2005命令行窗口,输入“devenv /ResetAddin Microsoft.InteropFormTools.InteropFormProxyGenerator.Connect”就可以了。

三、使用步骤

完成上述步骤后,接下来就可以使用InteropForm了。为了便于说明,下面笔者以在VB6中调用.Net 2.0的SMTP邮件发送功能为例,介绍一下具体的使用步骤。

1.启动VS2005后,在起始页上选择“创建项目”。然后在Visual Basic项目类型下选择“VB6 InteropForm Library”,并在输入项目名称SMTPMail后单击“确定”。

2.打开项目下的“InteropForm1.vb”,并切换到代码视图,这时会看到在类名的上方有一个名为“”的属性,正是这个属性标志了我们正在开发的类是一个采用了InteropForm技术的特殊类,在后面我们还会看到其他类似的属性。

48-f19-b1.jpg

3.依照VB.NET的语法,为类添加必要的构造函数、属性、方法、事件。

注意:在每个属性、方法、事件的定义语句上方都要增加下表所示的对应属性。

需要说明的是,如果使用默认的构造函数(即没有参数),可以省略“InteropFormInitializer”属性,但是如果定义的构造函数包含参数,则必须加上该属性。完成上述步骤后的代码显示如下:

<InteropForm()> _

Public Class VBNETMail

Private bSuccess As Boolean

Public Sub New()

' 此调用是Windows 窗体设计器所必需的。

InitializeComponent()

......

End Sub

''' <summary>

''' 实现邮件发送功能

''' </summary>

''' <remarks></remarks>

<InteropFormMethod()> _

Public Function Send() As Boolean

'创建SMTP客户端实例

Dim client As New SmtpClient()

......

End Function

''' <summary>

''' 定义邮件接受人

''' </summary>

''' <remarks></remarks>

Private _Recevier As String

<InteropFormProperty()> _

Public Property Recevier() As String

Get

Return _Recevier

End Get

Set(ByVal value As String)

_Recevier = value

End Set

End Property

......

<InteropFormEvent()> _

Public Event Failure As FailureEventH

andler

Public Delegate Sub FailureEventHand

ler(ByVal FailureText As String)

End Class

4.在“工具”菜单下单击“Generate InteropForm Wrapper Class”,稍等片刻,在项目下就会自动生成一个名为“InteropForm Wrapper Classes”的目录。

5.最后,编译应用程序。

到此为止,.Net端的编码全部结束,下面我们要转到VB6继续后面的步骤。

1.在VB6下新建一个项目,在“工程”菜单下单击“引用”,并从列表中选中“Microsoft InteropForm Toolkit Library”和此前在VS2005下生成的Com组件(即项目名称SMTPMail);

2.在VB6新建一个模块,并输入以下代码:

Public g_InteropToolbox As InteropToo

lbox

Sub main()

' 初始化InteropToolbox

Set g_InteropToolbox = New InteropToo

lbox

' 仅在第一次创建InteropToolBox时执行初始化方法,其主要目的是调试

g_InteropToolbox.Initialize

' 激活InteropToolBox的启动事件

g_InteropToolbox.EventMessenger.RaiseApplicationStartedupEvent

……

End Sub

说明:在任何一个使用InteropForm的程序中,上述代码都是必需的。其原因在于,当在VB中调用一个WinForm窗体时,.Net应用程序不会自动感知到原VB程序是否退出。所以,必须由InteropToolbox全程管理所有生成的WinForm窗体。

3.在VB的窗体上添加一个命令按钮,然后输入下面代码:

Dim WithEvents mail As SMTPMail.VBNETMail

Private Sub cmdSend_Click()

Set mail = New VBNETMail

……

End Sub

Private Sub Form_Unload(Cancel As Integer)

' 在应用程序卸载时关闭InteropToolBox

g_InteropToolbox.EventMessenger.RaiseApplicationShutdownEvent

End Sub

Private Sub mail_Failure(ByVal Failure Text As String)

MsgBox ("邮件发送失败:" + FailureText)

End Sub

4.按F5运行程序,按下命令按钮就可以看到实际的效果了。

注:所有代码在VB6.0 SP5、VS2005、XP SP2下调试通过。