locked
FAQs: 把VB6项目 编程VB.NET 项目时会出现的问题? RRS feed

  • 问题

  • 为了帮助大家更好地学习 Visual Basic技术,微软论坛技术支持团队编辑了一些列的 "Visual Basic 常见问题及解答" 精华帖。

    本帖的主题是:把VB6项目 编程VB.NET 项目时会出现的问题?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "Visual Basic 常见问题及解答",请打开索引页面:
    http://social.msdn.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/c9ab4b8e-99dc-49a2-bcea-30f3ecc3c3b7


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    2011年3月3日 2:31

答案

  •      当你把VB6项目升级为VB.NET 项目时,可能会发生以下问题:

    1)  窗体.

    VB6VB.NET 在一些事件的发生顺序上有细微的差别。

    比如说,VB6Load事件是最先发生的,但是在VB.NET 中最先发生的是Resize事件,这取决于你设计时给控件的属性值,可能会导致一系列的事件在load事件之前发生。《Resolving issues with Forms这本书的第12章有详细介绍,相关的网站地址如下:

    http://social.msdn.microsoft.com/Forums/en/vbinterop/thread/adc75876-f70b-45b7-8083-ce66473941f1

    2)  ADOADO.NET

     

           ADO 是基于COM 的技术。你可以在.NET 程序中使用ADO。但是COM Interop 并不是很好。ADO.NET .NET Framework 中的数据访问技术,它提供了一系列的模板去连接数据库,访问数据库。在.NET Framework 中建议使用ADO.NET 数据访问技术。以下链接的第14和第20章有详细的说明ADOADO.NET 之间的区别:

    http://msdn.microsoft.com/en-us/vbasic/ms788236.aspx

     

    3)  在窗体应用程序中使用ActiveX的问题

           在窗体应用程序中可以使用ActiveX控件。但是有一些在.NET 环境中不被支持,以下是不被支持的控件:

    · Container controls

     

    · Windowless controls

     

    · DAO-based data-bound controls

     

    · Controls that make use of internal Visual Basic 6 interfaces

     

    · Components that hook into the Visual Basic 6 extensibility model

     

    · ActiveX designers

     

    更多详细信息请阅读下面链接的第13章:

    http://msdn.microsoft.com/en-us/vbasic/ms788236.aspx

      .NET 环境中很少用到ActiveX控件。

     

    4)  怎么升级ObjPtr StrPtr

                                 VB6 2个返回一个32位地址很有用的函数:ObjPtr StrPtr

                            但是在.NET 中不再支持。在.NET中,不允许任何类型来直接获取内存地址。

                          如果 要得到内存地址,要引入以下命名空间:System.IntPtr, System.Runtime.

                  InteropServices.Marshal System.Runtime. InteropServices.GcHandle

                    下面的代码实现了取得32位内存地址:

                    

    Imports System.Runtime.InteropServices

    Module Module1

        Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _

        (ByVal lpDest As Integer, ByVal lpSource As Integer, _

        ByVal cbCopy As Integer)

        Sub Main()

            Dim sourceString As String, destString As String

            sourceString = "Hello"

            destString = " World"

            Dim sourceGCHandle As GCHandle = _

            GCHandle.Alloc(sourceString, GCHandleType.Pinned)

            Dim sourceAddress As Integer = _

            sourceGCHandle.AddrOfPinnedObject.ToInt32

            Dim destGCHandle As GCHandle = _

            GCHandle.Alloc(destString, GCHandleType.Pinned)

            Dim destAddress As Integer = _

            destGCHandle.AddrOfPinnedObject.ToInt32

            CopyMemory(destAddress, sourceAddress, 10)

            sourceGCHandle.Free()

            destGCHandle.Free()

            MsgBox(destString)

        End Sub

    End Module

    更多详细信息请参考下面链接中的第263      

    http://msdn.microsoft.com/en-us/vbasic/ms788236.aspx
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    2011年3月3日 2:32