前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA解析VBAProject 02——解析

VBA解析VBAProject 02——解析

作者头像
xyj
发布2020-09-18 10:59:46
1.6K0
发布2020-09-18 10:59:46
举报
文章被收录于专栏:VBA 学习VBA 学习VBA 学习

在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 & "VBA\dir", b)
    If VBA.Len(ret) Then
        '继续尝试03版本的路径
        PrePath = "Root Entry\_VBA_PROJECT_CUR\"
        ret = cf.GetStream(PrePath & "VBA\dir", b)
        If VBA.Len(ret) Then
            Parse = "CVBAProject: 没有找到VBA\dir流"
            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后面再解析。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档