vba读取外接设备的基本信息_VBA解析VBAProject 05——提取模块代码

c1d96fcfb5b2640cece2477a6c54d2ab.png

通过前面的文章能够知道,每一个模块的代码,在VBAProject中也就是一个数据流,这个数据流经过了run length encoding的算法进行压缩。

前面介绍的是自己使用VBA代码来解压缩,其实也有现成的API RtlDecompressBuffer可以使用,具体用法可以网上找找。

所以,只要能找到模块的数据流,然后进行解压缩就可以还原模块的代码。模块的数据流也就是在复合文档中读取一个数据流,另外要注意的是,这样读取出来的模块数据流并不都是我们写的VBA代码,还需要结合解析dir流时候得到的模块信息进行截取,再进行解压缩:

'读取某个模块的代码'ModuleName 模块的名称'StrCode    返回模块的代码'Return     返回出错信息Function GetModuleCode(ModuleName As String, ByRef StrCode As String) As String    Dim ret As String        Dim b() As Byte    '读取原始的流    ret = cf.GetStream(PrePath & "VBA\" & ModuleName, b)    If VBA.Len(ret) Then        GetModuleCode = ret        Exit Function    End If        'vba代码只是后面的一部分    Dim bCode() As Byte        Dim moduleIndex As Long    moduleIndex = GetModuleIndex(ModuleName)    If moduleIndex = -1 Then        GetModuleCode = "CVBAProject: 在ModuleInfo_中没有找到模块[" & ModuleName & "]"        Exit Function    End If        Dim i As Long, j As Long    '跳过前面不需要的部分    ReDim bCode(UBound(b) - ModuleInfo_(moduleIndex).Offset) As Byte    For i = ModuleInfo_(moduleIndex).Offset To UBound(b)        bCode(i - ModuleInfo_(moduleIndex).Offset) = b(i)    Next        ''run length encoding解码dir流    Dim cr As CRLE    Set cr = New CRLE    ret = cr.UnCompress(bCode, bCode)    If VBA.Len(ret) Then        GetModuleCode = ret        Exit Function    End If    Set cr = Nothing        StrCode = VBA.StrConv(bCode, vbUnicode)End Function

0ace52ee82e0180a53c482767bb6a6f7.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值