1,486
社区成员
发帖
与我相关
我的任务
分享
Private Const RT_CURSOR = 1
Private Const RT_BITMAP = 2
Private Const RT_ICON = 3
Private Const RT_MENU = 4
Private Const RT_DIALOG = 5
Private Const RT_STRING = 6
Private Const RT_FONTDIR = 7
Private Const RT_FONT = 8
Private Const RT_ACCELERATORS = 9
Private Const RT_RCDATA = 10
Private Const RT_MESSAGETABLE = 11
Private Const RT_GROUP_CURSOR = 12
Private Const RT_GROUP_ICON = 14
Private Const RT_VERSION = 16
'资源叶子信息
Private Type ResourceLeafInfo
nTypeID As Long '资源类型
pStructRA As Long '此资源的 IMAGE_RESOURCE_DATA_ENTRY 结构相对地址(从资源段算起)
pDataAA As Long '此资源的绝对地址(从文件首部算起)
cbSize As Long '资源大小
End Type
'递归遍历资源树,获得叶节点相关数据
Private Sub PickLeaves(hFile As Long, _
pResOffset As Long, _
pNodeEntry As Long, _
nTypeID As Long, _
tResLeafInfo() As ResourceLeafInfo)
Dim tResDir As IMAGE_RESOURCE_DIRECTORY
Dim tResDirEntry As IMAGE_RESOURCE_DIRECTORY_ENTRY
Dim tResDataEntry As IMAGE_RESOURCE_DATA_ENTRY
Dim i As Long
Call llseek(hFile, pResOffset + pNodeEntry, FILE_BEGIN)
Call lread(hFile, tResDir, Len(tResDir))
For i = 0 To tResDir.NumberOfIdEntries + tResDir.NumberOfNamedEntries - 1
Call llseek(hFile, pResOffset + pNodeEntry + Len(tResDir) + Len(tResDirEntry) * i, FILE_BEGIN)
Call lread(hFile, tResDirEntry, Len(tResDirEntry))
If CBool(tResDirEntry.OffsetToData And &H80000000) Then '指向下一个目录节点
Call PickLeaves(hFile, pResOffset, tResDirEntry.OffsetToData And &H7FFFFFFF, nTypeID, tResLeafInfo())
Else '指向数据入口
Call llseek(hFile, pResOffset + tResDirEntry.OffsetToData, FILE_BEGIN)
Call lread(hFile, tResDataEntry, Len(tResDataEntry))
ReDim Preserve tResLeafInfo(UBound(tResLeafInfo) + 1) As ResourceLeafInfo
With tResLeafInfo(UBound(tResLeafInfo))
.nTypeID = nTypeID
.pStructRA = tResDirEntry.OffsetToData
.pDataAA = tResDataEntry.OffsetToData
.cbSize = tResDataEntry.Size
End With
End If
Next i
End Sub