架起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”,并切换到代码视图,这时会看到在类名的上方有一个名为“

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下调试通过。