none
Excel VBA Input语句存在GDI泄漏? RRS feed

  • 问题

  • 今天花了很长时间修正我的VBA版程序,原因是游戏结束后GDI对象的个数不能回归游戏开始前的数值,调试了一晚上,终于发现问题居然出在InputBox语句中,通过以下实验,证实了我的想法:
    1。新建一个空白工作表,进入VB编辑器,新建一个空白窗体,加入以下代码:
    Private Sub UserForm_Click()
        InputBox ""
    End Sub
    2。按Ctrl + Shift + ESC打开任务管理器,转到“进程”,从“查看-选择列”中选中“GDI对象”
    3。运行窗体,记下当前Excel进程的GDI对象数目,在UserForm上点击,然后在弹出的InputBox中点确定或取消,可以看到Excel进 程的GDI对象数目增加了1,重复N次,GDI对象数目增加N,一直不会释放,即使关闭UserForm窗体,Excel进程的GDI对象也比未打开窗体 之前增加了N
    4。更过分一点,使用下列代码:
    Private Sub UserForm_Click()
        For i = 1 To 300
            InputBox ""
        Next
    End Sub
    记住Excel进程的GDI对象数目,按F5运行窗体,在窗体上点击一下以后一直按ESC不松手,待所有Inputbox全部关闭以后,关闭窗体,可以看到Excel进程的GDI对象数量增加了300。
    这是微软的Bug还是我电脑的问题?在网上没有搜到相关解释,请各位帮我测试一下。
    在此还要提醒各位,事情没弄清之前尽量使用Application.InputBox来代替InputBox,因为前者没有发现此问题
    2013年11月20日 7:07

全部回复