На примере: Если открыть файл shell32.dll в любом менджере ресуросов(PE Explorer / Resource Hacker), то можно увидеть, что иконки с идентификаторами (1-8) принадлежат группе (62998)
256 × 256 (16.8mil colors) - Ordinal name: 1
64 × 64 (16.8mil colors) - Ordinal name: 2
48 × 48 (16.8mil colors) - Ordinal name: 3
40 × 40 (16.8mil colors) - Ordinal name: 4
32 × 32 (16.8mil colors) - Ordinal name: 5
24 × 24 (16.8mil colors) - Ordinal name: 6
20 × 20 (16.8mil colors) - Ordinal name: 7
16 × 16 (16.8mil colors) - Ordinal name: 8
Для чего мне это нужно ? Пытаюсь допилить загрузчик иконок через res протокол не используя сторонние COM объекты и соответствено API функции.
Беда в том, что иконки хранящиеся как PNG (Например ICON 203) выгружаются нормально, а иконки формата ICO выгружаются без заголовков, из-за этого не отображаются нормально при просмотре. Пример можно наблюдать в простой HTML странице:
- Код: Выделить всё
<!DOCTYPE html>
<html>
<head>
<title>trouble sample</title>
</head>
<body>
<img src="res://shell32.dll/3/203">
<img src="res://shell32.dll/3/204">
</body>
</html>
Пошарив в гугле и почитав MSDN, выяснил, что для выгрузки иконки в полноценном виде, нужно найти её ICON GROUP, в нём можно найти информацию о размере, цветности и т.п параметрах изображения. Тогда можно собрать заголовок, "прицепить" к выгруженным данным и получить нормальную просматриваемую иконку.
Пока разобрался, что ресурс ICON GROUP содержит всю информацию о хранимых иконках:
- Код: Выделить всё
Dim oReader
Dim oStream
Dim i
Dim sTmp
Set oReader = CreateObject("MSXML2.XMLHTTP")
oReader.Open "?","res://shell32.dll/14/62998"
oReader.Send
Dim imgCount, nImg
print("Reserved: " & GetBytes(2))
print("Type: " & GetBytes(2))
imgCount = GetBytes(2)
print("ImageCount:" & imgCount)
For nImg = 1 to ImgCount
print("Width: " & GetBytes(1))
print("Height: " & GetBytes(1))
print("Colors: " & GetBytes(1))
print("Reserved: " & GetBytes(1))
print("Planes: " & GetBytes(2))
print("BitsPerPixel: " & GetBytes(2))
print("ImageSize: " & GetBytes(4))
print("ImageOffset: " & GetBytes(2))
print("-----------------------------")
Next
MsgBox sTmp
Function print(text)
sTmp = sTmp & text & vbCrlf
End Function
Function GetBytes(n)
GetBytes = AscB(MidB(oReader.ResponseBody,i+1,n))
i = i + n
End Function
Но пока никак не могу найти информацию о том, как (и можно ли) найти обратную связь от идентификатора иконки к её группе.
Если я правильно понял, то API функция FindResource как раз позволяет это сделать.
Вопрос в том как она работает. Неужели шерстит перебором все группы иконок и ищет совпадение с идентификатором искомой иконки ? Не может же быть такого ?
P.S Если алгоритм существует, поделитесь пожалуйста описанием / ссылкой / т.п. Заранее благодарю.