为什么Word2013中的InlineShape.add会导致内存泄漏

时间:2019-04-16 11:32:34

标签: vba memory-leaks ms-word

我的程序必须将照片添加到Word文档表中。面对这样一个事实,在Word 2013中,该程序的运行速度要慢得多,甚至挂起。我开始寻找问题区域,似乎问题出在添加图像时占用的内存中。

我通过InlinesShapes.AddPicture方法将图像添加到Word 2013表中。 之后,每个图像的已用内存将增加〜50 Mb。当达到约600 mb时,它将停止以该速率增长,并且增长约为1 mb。然后,在某个时候,Word最多清除200条内存,然后重新全部清除。

但是,如果我在Word 2007中执行相同的操作,则始终占用的内存小于1 kb。

我的笔记本上的Word 2007(Win 8.1,i5-4300u),Word 2013安装在其他计算机上(带有Win 7的虚拟桌面,至强E5)。

我要添加用相机拍摄的普通照片,例如:4160x3120、72 dpi,24位,500 Kb大小,JPG。

具有已用内存计算的示例代码

Sub A()  
    ' >-- SOME CODE --<

    Dim objCell As Word.Cell
    'user method that return first free Word.Cell from table
    Set objCell = TableManager.Get_FreeCell(objTable) 
    'clear
    Tools.MemCheck "<- mem before paste"

    objCell.Range.InlineShapes.AddPicture sFilePath 

    'clear
    Tools.MemCheck "-> mem after paste"

    ' >-- SOME CODE --<

    Set objCell = Nothing
 End Sub

Word2013的输出

    296.156 Mb <- mem before paste
    345.793 Mb -> mem after Paste
    346.504 Mb <- mem before paste
    396.18  Mb -> mem after Paste

Word2007的输出

    109.867 Mb <- mem before paste
    109.871 Mb -> mem after Paste
    109.871 Mb <- mem before paste
    109.879 Mb -> mem after Paste
    109.887 Mb <- mem before paste
    109.887 Mb -> mem after Paste

有MemCheck的代码。将mobjSWbemServices声明为全局,以将其排除在问题之外。

Dim mobjSWbemServices as Object
Sub MemCheck(Optional ByVal sDescription As String = vbNullString)
    If mobjSWbemServices is nothing then Set mobjSWbemServices = GetObject("winmgmts:")
    Dim GetMemUsage As Double
     GetMemUsage = mobjSWbemServices.Get( _
        "Win32_Process.Handle='" & _
        GetCurrentProcessId & "'").WorkingSetSize / 1024 / 1024    

    Debug.Print Round(GetMemUsage, 3); " Mb"; vbTab; sDescription
   'GetCurrentProcessId  is Declared Library: 
     'Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
     'Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
End Sub

那么可能是什么问题?我是在做错什么还是错误,需要安装一些更新?

1 个答案:

答案 0 :(得分:0)

在Word 2007(和2010)与Word 2013(和更高版本)之间使用的图形引擎发生了重大变化。 可能是一个因素。我还记得,在Word 2013(及更高版本)中对象模型的速度也较慢,部分原因是出于安全原因。因此,您可能无能为力。

您可以尝试的一件事是清除Word的UNDO堆栈并显式保存文档。这样可以减少Word为了支持撤消而正在管理的对象数量,并可以加快处理速度。