Wednesday, 31 October 2007

怎样转换VB.NET数据类型到COM类型

这次的project是在VB6中使用VB.NET的数据类型。在网上看到不少文章介绍怎样在VB.NET中生成一个COM类,参考:http://www.microsoft.com/china/msdn/library/langtool/vbnet/dnvs05VBBestPrac.mspx?mfr=true

但我的问题是,已经现有一个VB.NET类,必须使它能够被vb使用。找了些资料,发现COM类最主
要的特性就是接口和唯一性。

接口:就像所有其它类型或组件一样,一般都是public function之类的,这个不用再做修改。
唯一性:这个特别重要,因为微软上的每个COM组件都是要注册的,以保证每人有个唯一的注册号。依上面链接的指导,如果我们添加COM类,VB.NET会自动添加以下内容

“ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)_ ”
Public Class ComClass1

#Region "COM GUIDs"
' Ces GUID fournissent l'identité COM pour cette classe
' et ses interfaces COM. Si vous les modifiez, les clients
' existants ne pourront plus accéder à la classe.
Public Const ClassId As String = "896AD73D-332B-4F9F-84C0-3CCB36C9DB8C"
Public Const InterfaceId As String = "73EA9A94-5B49-4ED7-8E08-9774A8B0DE86"
Public Const EventsId As String = "C4771D07-6179-4894-A731-3672666AE092"
#End Region

' Une classe COM pouvant être créée doit avoir Public Sub New()
' sans paramètre, sinon, la classe ne sera pas
' inscrite dans le Registre COM et ne peut pas être créée
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub

End Class


其实这些内容就是我们要添加到现有VB.NET类上的,例如此类名称是myClass
1.“ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId) _”添加到类型声明之前,并用“myClass”替换所有“Class1”,原因不用说了吧
2. “#Region "COM GUIDs"”添加到类型声明之后,不用做任何修改,等下告诉你们为什么
3. “Public Sub New() ”这个Constructor特别重要,因为每个COM组件都必须要由一个没有参数的New()来Instantiate。

添加好了,就万事大吉了吗?不,还要记得把之前生成的Class1从project里删除,否则就会存在两个类(myClass和Class1)有同样的ID,这也就是为什么我们不用对第二部分做任何修改,删除了Class1后,我们不就可以使用Class1的ID唯一性和可用性了吗?我是不是很聪明哈~~~

接下来就是重新regenerate project,然后在VB6里调用此COM组件啦! 对了,记得你的project要生成一个可供VB使用的DLL啊

PS:为了保证意思表达的准确性,一些不肯定的单词直接用英语了,希望大家谅解

No comments: