VBA解析VBAProject 02——解析

时间:2022-07-25
本文章向大家介绍VBA解析VBAProject 02——解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在VBA解析中已经介绍,VBAProject无论是03版本的还是07版本的,都是一个数据流。

  • 在03版本中它就是在文件中,03版本的Office就是一个复合文档。
  • 在07版本中,Office文件本身是一个ZIP压缩包,VBAProject就是其中的一个压缩文件,解压缩ZIP后,它仍然是一个复合文档。

所以,VBAProject就是一个特殊的复合文档,解析VBAProject就是解析一个复合文档。

在解析的时候,可以进一步去判断是否有dir流,这样就能够知道是不是一个VBAProject,而且也能够判断是03版本的还是07版本的:

新建一个类CVBAProject:

Private cf As CCompoundFile
Private PrePath As String '前缀路径,03版本是Root Entry_VBA_PROJECT_CUR
                          '          07版本是Root Entry

Function Parse(ir As IReadWrite) As String
    Dim ret As String
    ret = cf.Parse(ir)
    If VBA.Len(ret) Then
        Parse = ret
        Exit Function
    End If

    Dim b() As Byte
    ret = cf.GetStream(PrePath & "VBAdir", b)
    If VBA.Len(ret) Then
        '继续尝试03版本的路径
        PrePath = "Root Entry_VBA_PROJECT_CUR"
        ret = cf.GetStream(PrePath & "VBAdir", b)
        If VBA.Len(ret) Then
            Parse = "CVBAProject: 没有找到VBAdir流"
            Exit Function
        End If
    End If

    'run length encoding解码dir流
    Dim cr As CRLE
    Set cr = New CRLE
    ret = cr.UnCompress(b, b)
    If VBA.Len(ret) Then
        Parse = ret
        Exit Function
    End If
    Set cr = Nothing

    '解析dir流
    Dim cd As CDir
    Set cd = New CDir
    ret = cd.GetModuleInfo(b, ModuleInfo_)
    If VBA.Len(ret) Then
        Parse = ret
        Exit Function
    End If

    Set cd = Nothing
End Function

解析代码很简单,主要的处理过程都在CCompoundFile类中,具体查看VBA解析复合文档相关文章。

CRLE类和CDir后面再解析。