none
不好意思,我用Office 2016 X64 Excel自带的VBA编程时碰到一个bug,可能是关于内存释放的问题 RRS feed

  • 问题

  • 具体问题是这样的

    我以前很早就在office2010上编写了一个office软件,一直使用很好,最近因为想把32位的代码改成64位,还想添加点新功能,为了代码重构,所以加了一个类,而且我还以前32位的代码有些部分改成了64位的例如说Declare加了PtrSafe。自从加了这个类以后,我每次运行我的程序,然后关闭Office,Office就会陷入一个死循环,我觉得应该是内存回收机制的Bug,不知道是不是32和64位之间的兼容性问题。

    我加的类很简单,运行也没bug,关闭 office以后鼠标就成了蓝圈圈在转,进入任务管理看内存,excel的内存总是在增加几M然后又减少几M,比较平衡,大概在105M和108之间变化,我的这个表才200多K,下面的图是我重新截的,我打开Excel运行这个表的时候Excel占60M内存,运行了一段时间,涨到100多M,而且光Excel一项的CPU占用持续保持在20%左右(想关闭Excel以后,我正常用的没有这么高),我这是电脑是I7-4代的,正常不可能占用率这么高,而且200k的程序要多出40M你想想要多少次内存没有释放,所以我估计是内存释放的问题。

    下面是我写的那个类,类名Txtbox,如果我不用这个类,运行Excel没有这个问题,一运行这个类,关闭Excel就会出现无法正常关闭Excel的问题

    另外,运行这个类,我的程序在运行时完全没问题,我估计是内存释放的bug,我这个程序很小,只有这么一个类。而且我加这个类以前一切良好

    文件是xlsm格式,请问如何解决,是我写的类有问题,还是Office2016 64的内存释放机制有bug?

    Public WithEvents Txtbox As MSForms.TextBox

    Public Sub Init(Tmb As MSForms.TextBox) 'Initialize the Class

      Set Txtbox = Tmb
    End Sub

    Private Sub Txtbox_Change() 'New method

        Call Illustration.Show_Example

    End Sub

    Private Sub Class_Terminate() 'Release the memory
       Call ReleaseClass
    End Sub

    Private Sub ReleaseClass() 
       Set Txtbox = Nothing
    End Sub

    '如果2个类互为引用的时候,释放内存是需要最后这个函数来完全释放,我取消这个,把 Set Txtbox = Nothing放到  Class_Terminate还是不行

    其他一切正常

    另外试过安全模式,也没有COM加载项

    2017年8月16日 8:53