Как узнать номер иконки DLL или EXE-файла
Содержание
- 1 Как узнать номер иконки DLL или EXE-файла
- 1.1 Как узнать номер иконки DLL или EXE-файла
- 1.2 Как узнать номер иконки DLL или EXE-файла
- 1.3 Как извлечь иконку из EXE и DLL
- 1.4 Файл ICO
- 1.5 Как извлечь иконку из EXE и DLL
- 1.6 Заключение
- 1.7 Как узнать номер иконки DLL или EXE-файла
- 1.8 Как узнать номер иконки DLL или EXE-файла
- 1.9 Как узнать номер иконки DLL или EXE-файла
Как узнать номер иконки DLL или EXE-файла
В темах с коллекциями скинов вопросы и обсуждения запрещены! Пожалуйста внимательно читайте заголовки тем.
Crystal Icon Set (QVGA & VGA) — это одна из многих библиотек от программы IconXT. Зайдя по приведённой чуть ниже ссылке, можно скачать файлы с расширением *.ixt. Скачайте файл и смените расширение с *.ixt на *.dll. Взято с JDH Software.com:
_http://www.jdhsoftware.com/index.php?file=Page&name=IconXT_Skins
Author/Copyrights: CrystalXP, Everaldo
Вот как то давно делал иконки для SK Shortcut Manager
img-9389-1234.JPG
И так же юзаю их для подмены в файле ResHacker’ом 😀
Все иконки находятся в одном dll! Суммарно их порядка 197 штук размеры 16х16, 32х32, 64х64
Download : VAIO_SK_Shortcut_Manager.zip
Сообщение отредактировал e202 — 06.10.06, 07:02
Вот у братьев белорусов на wce.by нашел.Для VGA ничё так смотрится(хотелось бы получше) , а на qVGA думаю будут отлично смотреться.
Vista Inspirat (QVGA & VGA) — это одна из многих библиотек от программы IconXT. Для того, чтобы вновь использовать данную библиотеку в IconXT, достаточно сменить расширение на .ixt, то есть, переименовать VistaInspirat.dll в VistaInspirat.ixt.
Author/Copyrights: Crystal XP, dlb
Vista Cameleon (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
Macintosh Icon Set (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
VBTWO or Vista Beta Lite (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
VAIO Icon Set (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
Windows Vista PE (QVGA) — это одна из многих библиотек для программы IconXT.
Vista RC1 (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
IconsLib (QVGA) — библиотека иконок 16*16 и 32*32. Размер: 64kB
Как узнать номер иконки DLL или EXE-файла
Здравствуйте,
помогите разобраться пожалуйста.
Вопрос относительно иконок в Dll и Exe файлах. К примеру кнопки Internet Exlorer ссылаются на иконки в Dll или Exe файле вот так:
C:PROGRAM FILESSIBER SYSTEMSAI ROBOFORMROBOFORM.DLL,201
Это якобы должно означать, что нужна иконка под № 201. Но дело в том, что в этом файле их только 20 (проверено разными способами и програмами). Как узнать какая нужна иконка? Это точно не первая иконка файла. Я пользовался
ExtractAssociatedIcon(РInstance, PChar(Name), IconIndex) и
ExtractIcon(РInstance, PChar(Name), IconIndex) результат одинаков.
← →
Suntechnic ( 2002-06-06 19:56 ) [1]
№ 201 это не номер иконки, а её идентификатор, а кто сказал, что они должны быть по порядку?
Хочешь извлечь иконку с идентификатором № 201? Тогда делай LoadLibrary и дальше LoadIcon c идентификатором.
← →
Song ( 2002-06-06 20:40 ) [2]
← →
Nickolay ( 2002-06-07 12:58 ) [3]
а что это за функция? У TIcon такой нет. Какой Delphi?
← →
Song ( 2002-06-07 13:38 ) [4]
← →
Nickolay ( 2002-06-07 14:59 ) [5]
Народ, а можно пример? Что то я не совсем понял.
← →
Suntechnic ( 2002-06-07 20:27 ) [6]
>Song © (07.06.02 13:38)
Что то ты тут напутал. У TIcon нет такой ф-ции. У TBitmap есть. Правда может в 6 версии добавили, так что спорить не буду, да и вопрос вроде в конференции по Win API.
>Nickolay (07.06.02 14:59)
Ну что здесь не понятного. Иконки обычно хранятся в ресурсах. Ресурсы могут быть как у exe так и у dll. А иногда dll просто используется как хранилище ресурсов и ничего более. Так вот, если иконка находится не у тебя в exe, а где-то в dll то тебе необходимо загрузить эту dll с помошью LoadLibrary. А затем используя API ф-цию LoadIcon загрузить иконку из данной dll. Особое внимание обрати на первый параметр ф-ции LoadIcon. Туда должен передаваться handle твоей загруженной dll, который ты получишь после LoadLibrary.
← →
Song ( 2002-06-07 23:12 ) [7]
2Suntechnic © (07.06.02 20:27) Delphi 6:
Loads an icon resource into the icon object.
procedure LoadFromResourceName(Instance: Cardinal; const ResName: string);
LoadFromResourceName loads the specified icon resource from a module»s executable file.
Instance is the handle of the module that contains the resource.
ResName is the name of the resource to load.
← →
Nickolay ( 2002-06-10 11:09 ) [8]
2 Suntechnic
Всем огромное спасибо за помощь, теперь я понял и все заработало.
← →
Nickolay ( 2002-06-12 10:37 ) [9]
Возникла еще одна проблема.
Не вытаскиваются иконки из ЕХЕ файлов под Win98/ME.
LoadLibrary срабатывает, а вот LoadIcon возвращает 0. Кто нибудь знает в чем тут дело?
вот код:
procedure TForm1.Button2Click(Sender: TObject);
var
Name : String;
Ico : HIcon;
IconIndex : word;
AModule : THandle;
begin
Name := Edit3.Text;
IconIndex := StrToInt(Edit4.Text);
AModule := LoadLibraryEx(PChar(Name),0,LOAD_LIBRARY_AS_DATAFILE);
Edit1.Text := IntToStr(AModule);
Ico := LoadIcon(AModule,PChar(IconIndex));
Edit2.Text := IntToStr(Ico);
DrawIcon(Form1.Canvas.Handle,10,10,Ico);
FreeLibrary(AModule);
end;
← →
Song ( 2002-06-12 11:16 ) [10]
А ExtractAssociatedIcon() не подойдёт? Там и мороки меньше..
← →
Nickolay ( 2002-06-12 11:40 ) [11]
ExtractAssociatedIcon() не ту иконку возвращает. Эта ф-ция возвращает иконки по их порядковому номеру, т.е. не то что мне надо. Получается та же проблема что я в вопросе писал.
← →
Song ( 2002-06-12 12:20 ) [12]
Ok, тогда ExtractIcon() — эта будет ту возвращать.
← →
Nickolay ( 2002-06-12 14:12 ) [13]
2 Song
Спасибо, вроде работает если индекс иконки указывать отрицательным.
← →
Nickolay ( 2002-06-18 10:39 ) [14]
И снова проблема. На Win2000 работает несколько методов, все они возвращают то что надо, но под 98 и Милениум из DLL не вытаскивает, что примечательно из ЕХЕ вытаскивает правильно.
Как извлечь иконку из EXE и DLL
Иногда возникает ситуация при которой необходимо извлечь иконку из EXE и DLL-файла. Windows дает возможность использовать для ярлыков и программ иконки встроенные в файлы DLL и EXE, но не позволяет извлечь их и сохранить в формате ICO или PNG.
В этой статье мы рассмотрим несколько бесплатных программ, которые могут извлечь иконку из EXE и DLL файлов в Windows 10.
Файл ICO
ICO — это файл изображений, который используется для иконок приложений и ярлыков Windows. Файл ICO содержит одно или несколько изображений с различными размерами и глубиной цвета, поэтому их можно использовать с разным разрешением экрана. Традиционно исполняемые файлы содержат иконку в формате ICO, поэтому они отображаются в меню «Пуск» и на ярлыках на рабочем столе. Операционная система позволяет изменить иконку файла или ярлыка, загрузив ее из другого файла *.ICO, *.EXE, *.DLL.
В Windows 10 есть свои иконки, которые находятся в файлах:
- C:Windowssystem32shell32.dll
- C:Windowssystem32imageres.dll
- C:Windowssystem32moricons.dll
- C:Windowsexplorer.exe
Как извлечь иконку из EXE и DLL
Чтобы извлечь иконку из файла, вам потребуется сторонний софт. Для этого есть множество утилит. Я расскажу о трех надежных бесплатных программах, которые я использую.
Начнем с утилиты Resource Hacker.
Извлечь иконку из EXE или DLL с помощью Resource Hacker
Resource Hacker — это удобное и простое в использовании приложение, которое сэкономит ваше время при необходимости извлечь значок из файла в Windows 10.
Шаг 1: Скачайте Resource Hacker .
Шаг 2: Установите приложение.
Шаг 3: Запустите приложение Resource Hacker.
Шаг 4: Перейдите в меню «Файл» —> «Открыть» или нажмите Ctrl + O, чтобы найти файл, из которого следует извлечь иконку (я открою папку c:windowsexplorer.exe).
Шаг 5: На левой панели разверните группу значков и перейдите к нужному значку (используйте область предварительного просмотра справа).
Шаг 6: В меню выберите «Действие» —> «Сохранить ресурс * .ico».
Шаг 7: Выберите папку для сохранения файла ICO и нажмите Сохранить.
Теперь значок извлечен и сохранен в файле *.ico:
Несколько советов по использованию Resource Hacker
- Resource Hacker — это 32-битное приложение. Если вы используете его в 64-битной версии Windows 10, оно может не открыть определенные системные файлы. В таком случае вы можете скопировать их в другой каталог, например, скопировать файл c:windowssystem32shell32.dll в c:data и открыть файл c:datashell32.dll в Resource Hacker.
- Сохраняя отдельные иконки из группы иконок, вы получаете один файл с расширением ICO с одним размером иконки.
- Чтобы получить файл ICO со всеми доступными размерами значков, перейдите к узлу «Группа значков» на левой панели, разверните ее и повторите шаги, описанные выше.
Некоторым пользователям может быть сложно использовать Resource Hacker. Пара альтернативных приложений: IconViewer и IcoFX, позволят сохранять значков в других форматах изображений, включая PNG и BMP.
Извлечение иконки из файлов EXE и DLL с помощью IconViewer
Шаг 1: Скачайте IconViewer (есть как 32-битные, так и 64-битные версии программы).
Шаг 2: Установите приложение IconViewer.
Шаг 3 Откройте проводник и откройте папку, содержащую файл, из которого хотите извлечь иконки. Например, перейдите в c:WindowsSystem32.
Шаг 4: Щелкните правой кнопкой мыши по файлу с иконками, например, «shell32.dll» и выберите «Свойства» из контекстного меню.
Шаг 5: Перейдите на вкладку «Icons», добавленную приложением IconViewer.
Шаг 6: Выберите значок, который надо извлечь, и щелкните значок дискеты, чтобы сохранить его.
Шаг 7: Укажите папку назначения, имя файла и выберите формат файла (ICO, PNG или BMP). Далее нажмите на кнопку «Сохранить».
Извлечь иконку из EXE или DLL-файла с помощью IcoFX
IcoFX — еще один бесплатный инструмент, для извлечения значков ( официальный сайт ). Сегодня это уже платная программа, но к счастью, архив программ FileHippo по-прежнему предлагает для скачивания старую бесплатную версию 1.6.4.
Основное отличие IcoFX от приложений, упомянутых выше, заключается в том, что IcoFX — это полнофункциональный редактор иконок. Resource Hacker позволяет изменять файлы. IconViewer — это просто средство извлечения значков. С помощью IcoFX вы можете рисовать собственные значки, используя инструменты для рисования и наложения графических эффектов.
Чтобы извлечь значок из файла с IcoFX:
Шаг 1: Скачайте бесплатную версию 1.6.4 из архива FileHippo .
Шаг 2: Выберите File —> Open из меню (или нажмите Ctrl + O).
Шаг 3: Выберите файл для извлечения значка. Появится диалоговое окно со всеми значками, которые приложение смогло найти в данном файле.
Шаг 4: Выберите иконку и нажмите «Extract». Это откроет значок в редакторе.
Шаг 5: Чтобы извлечь значок определенного размера, щелкните правой кнопкой мыши по его миниатюре в левой панели редактора и нажмите на кнопку «Экспорт изображения …» в контекстном меню.
Шаг 6: Укажите папку для хранения файла, нужный формат файла (PNG, BMP, JPEG, GIF или JP2) и присвойте имя файлу.
Шаг 7: Нажмите на кнопку «Сохранить».
Заключение
На этом все. Теперь вы знаете как извлечь иконки из DLL и EXE-файлов. В следующей статье я расскажу, как изменить иконку любой программы.
Как узнать номер иконки DLL или EXE-файла
200?’200px’:»+(this.scrollHeight+5)+’px’);»> GetIconFromResource(dest, source, idx)
<
; info: http://msdn.microsoft.com/en-us/library/ms997538.aspx
SetBatchLines, -1
if !hModule := Validation(dest, source, idx)
Return
for key, handle in FindGroup(source, idx, hModule)
<
pGroupInfo := GetResData(hModule, handle)
if !IsObject(DataArray := CreateDataArray(hModule, pGroupInfo, CountIcons, size, idx ? idx : A_Index))
<
if (DataArray = 6)
continue
else
break
>
pData := CreateDataBuff(DataArray, pGroupInfo, CountIcons, size)
res := Data2icoFile(pData, dest, size, idx)
> until !res
DllCall(«FreeLibrary», Ptr, hModule)
>
Validation(dest, source, idx)
<
if !((idx + 1) > 0 && source := ValidateName(source))
Return
static dwFlags := (LOAD_LIBRARY_AS_DATAFILE := 0x2 | LOAD_LIBRARY_AS_IMAGE_RESOURCE := 0x20)
if !hModule := DllCall(«LoadLibraryEx», Str, source, Ptr, 0, UInt, dwFlags, Ptr)
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, «Невозможно загрузить указанный модуль!`nОшибка » A_LastError, Str, «», UInt, 0)
ValidateName(FilePath)
<
SplitPath, FilePath. ext
if !(ext
= «i)exe|dll») && Error := «Допустимы только dll и exe файлы»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Error, Str, «», UInt, 0)
if !FileExist(FilePath)
<
EnvGet, PathVar, Path
Loop, parse, PathVar, `;
continue
until FileExist(p := RTrim(A_LoopField, «») . «» . FilePath) && (FilePath := p) && found := 1
if !found && Text := «Файл » FilePath » не найден»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
>
FindGroup(source, idx, hModule)
<
Names := [idx, 0]
DllCall(«EnumResourceNames», Ptr, hModule, UInt, RT_GROUP_ICON := 14
, Ptr, RegisterCallback(«EnumGroupIconProc», «Fast», 4), Ptr, pNames := Object(Names))
ObjRelease(pNames)
if (Names.3 = «») && Text := idx ? «Иконка » . idx . » в файле » . source . » не найдена»
: «Иконки в файле » . source . » не найдены»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
Names.Remove(1, 2)
for i, Name in Names
Names[i] := DllCall(«FindResource», Ptr, hModule, Name + 1 ? «UInt» : «Str», Name, UInt, RT_GROUP_ICON, Ptr)
Return Names
>
EnumGroupIconProc(hModule, Type, Name, lp)
<
(Name>>16) ? Name := LTrim(StrGet(Name+0), «#»)
obj := Object(lp)
if !obj.1
obj.Insert(Name)
else if ((obj.2 += 1) = obj.1)
Return, 0, obj.3 := Name
Return 1
>
GetResData(hModule, hRes)
<
hData := DllCall(«LoadResource», Ptr, hModule, Ptr, hRes, Ptr)
Return DllCall(«LockResource», Ptr, hData, Ptr)
>
CreateDataArray(hModule, pIconGroup, ByRef CountIcons, ByRef offset, idx)
<
if NumGet(pIconGroup+0, 2, «UShort») != 1 && Text := «Ресурс » Idx » неправильного типа. Возможно, файл сжат или зашифрован`nПродолжить?»
Return DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «Неправильный ресурс», UInt, 4)
DataArray := [], RT_ICON := 3
CountIcons := NumGet(pIconGroup+0, 4, «UShort»)
offset := 6 + CountIcons*16
Loop % CountIcons
<
id := NumGet(pIconGroup + 6 + 14*A_Index — 2, «UShort»)
hRes := DllCall(«FindResource», Ptr, hModule, UInt, id, UInt, RT_ICON, Ptr)
pIcon := GetResData(hModule, hRes)
DataArray[A_Index] :=
, offset: offset>
offset += s
>
Return DataArray
>
CreateDataBuff(DataArray, pIconGroup, CountIcons, size)
<
static IconData
VarSetCapacity(IconData, size)
DllCall(«RtlMoveMemory», Ptr, &IconData, Ptr, pIconGroup, Ptr, 6)
offset := 6
Loop % CountIcons
<
DllCall(«RtlMoveMemory», Ptr, &IconData + offset, Ptr, pIconGroup + offset — 2*(A_Index — 1), Ptr, 12)
NumPut(DataArray[A_Index].offset, &IconData + offset + 12, «UInt»), offset += 16
DllCall(«RtlMoveMemory», Ptr, &IconData + DataArray[A_Index].offset, Ptr, DataArray[A_Index].ptr, Ptr, DataArray[A_Index].size)
>
Return &IconData
>
Data2icoFile(pData, Dest, size, idx)
<
static i = 0
SplitPath, Dest,, Dir, Ext, OutNameNoExt
if !FileExist(Dir)
<
FileCreateDir, % Dir
if ErrorLevel && Text := «Невозможно создать папку » Dir «`nОшибка » A_LastError
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
>
(!idx) ? Dest := (Ext ? SubStr(Dest, 1, -(StrLen(Ext) + 1)) : Dest) . «(» . ++i . «)» . (Ext ? «.» . Ext : «»)
if !(File := FileOpen(Dest, «w»)) && Text := «Невозможно открыть файл » Dest «на запись`nОшибка » A_LastError
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
Как узнать номер иконки DLL или EXE-файла
В темах с коллекциями скинов вопросы и обсуждения запрещены! Пожалуйста внимательно читайте заголовки тем.
Crystal Icon Set (QVGA & VGA) — это одна из многих библиотек от программы IconXT. Зайдя по приведённой чуть ниже ссылке, можно скачать файлы с расширением *.ixt. Скачайте файл и смените расширение с *.ixt на *.dll. Взято с JDH Software.com:
_http://www.jdhsoftware.com/index.php?file=Page&name=IconXT_Skins
Author/Copyrights: CrystalXP, Everaldo
Вот как то давно делал иконки для SK Shortcut Manager
img-9389-1234.JPG
И так же юзаю их для подмены в файле ResHacker’ом 😀
Все иконки находятся в одном dll! Суммарно их порядка 197 штук размеры 16х16, 32х32, 64х64
Download : VAIO_SK_Shortcut_Manager.zip
Сообщение отредактировал e202 — 06.10.06, 07:02
Вот у братьев белорусов на wce.by нашел.Для VGA ничё так смотрится(хотелось бы получше) , а на qVGA думаю будут отлично смотреться.
Vista Inspirat (QVGA & VGA) — это одна из многих библиотек от программы IconXT. Для того, чтобы вновь использовать данную библиотеку в IconXT, достаточно сменить расширение на .ixt, то есть, переименовать VistaInspirat.dll в VistaInspirat.ixt.
Author/Copyrights: Crystal XP, dlb
Vista Cameleon (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
Macintosh Icon Set (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
VBTWO or Vista Beta Lite (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
VAIO Icon Set (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
Windows Vista PE (QVGA) — это одна из многих библиотек для программы IconXT.
Vista RC1 (QVGA & VGA) — это одна из многих библиотек для программы IconXT.
IconsLib (QVGA) — библиотека иконок 16*16 и 32*32. Размер: 64kB
Как узнать номер иконки DLL или EXE-файла
200?’200px’:»+(this.scrollHeight+5)+’px’);»> GetIconFromResource(dest, source, idx)
<
; info: http://msdn.microsoft.com/en-us/library/ms997538.aspx
SetBatchLines, -1
if !hModule := Validation(dest, source, idx)
Return
for key, handle in FindGroup(source, idx, hModule)
<
pGroupInfo := GetResData(hModule, handle)
if !IsObject(DataArray := CreateDataArray(hModule, pGroupInfo, CountIcons, size, idx ? idx : A_Index))
<
if (DataArray = 6)
continue
else
break
>
pData := CreateDataBuff(DataArray, pGroupInfo, CountIcons, size)
res := Data2icoFile(pData, dest, size, idx)
> until !res
DllCall(«FreeLibrary», Ptr, hModule)
>
Validation(dest, source, idx)
<
if !((idx + 1) > 0 && source := ValidateName(source))
Return
static dwFlags := (LOAD_LIBRARY_AS_DATAFILE := 0x2 | LOAD_LIBRARY_AS_IMAGE_RESOURCE := 0x20)
if !hModule := DllCall(«LoadLibraryEx», Str, source, Ptr, 0, UInt, dwFlags, Ptr)
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, «Невозможно загрузить указанный модуль!`nОшибка » A_LastError, Str, «», UInt, 0)
ValidateName(FilePath)
<
SplitPath, FilePath. ext
if !(ext
= «i)exe|dll») && Error := «Допустимы только dll и exe файлы»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Error, Str, «», UInt, 0)
if !FileExist(FilePath)
<
EnvGet, PathVar, Path
Loop, parse, PathVar, `;
continue
until FileExist(p := RTrim(A_LoopField, «») . «» . FilePath) && (FilePath := p) && found := 1
if !found && Text := «Файл » FilePath » не найден»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
>
FindGroup(source, idx, hModule)
<
Names := [idx, 0]
DllCall(«EnumResourceNames», Ptr, hModule, UInt, RT_GROUP_ICON := 14
, Ptr, RegisterCallback(«EnumGroupIconProc», «Fast», 4), Ptr, pNames := Object(Names))
ObjRelease(pNames)
if (Names.3 = «») && Text := idx ? «Иконка » . idx . » в файле » . source . » не найдена»
: «Иконки в файле » . source . » не найдены»
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
Names.Remove(1, 2)
for i, Name in Names
Names[i] := DllCall(«FindResource», Ptr, hModule, Name + 1 ? «UInt» : «Str», Name, UInt, RT_GROUP_ICON, Ptr)
Return Names
>
EnumGroupIconProc(hModule, Type, Name, lp)
<
(Name>>16) ? Name := LTrim(StrGet(Name+0), «#»)
obj := Object(lp)
if !obj.1
obj.Insert(Name)
else if ((obj.2 += 1) = obj.1)
Return, 0, obj.3 := Name
Return 1
>
GetResData(hModule, hRes)
<
hData := DllCall(«LoadResource», Ptr, hModule, Ptr, hRes, Ptr)
Return DllCall(«LockResource», Ptr, hData, Ptr)
>
CreateDataArray(hModule, pIconGroup, ByRef CountIcons, ByRef offset, idx)
<
if NumGet(pIconGroup+0, 2, «UShort») != 1 && Text := «Ресурс » Idx » неправильного типа. Возможно, файл сжат или зашифрован`nПродолжить?»
Return DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «Неправильный ресурс», UInt, 4)
DataArray := [], RT_ICON := 3
CountIcons := NumGet(pIconGroup+0, 4, «UShort»)
offset := 6 + CountIcons*16
Loop % CountIcons
<
id := NumGet(pIconGroup + 6 + 14*A_Index — 2, «UShort»)
hRes := DllCall(«FindResource», Ptr, hModule, UInt, id, UInt, RT_ICON, Ptr)
pIcon := GetResData(hModule, hRes)
DataArray[A_Index] :=
, offset: offset>
offset += s
>
Return DataArray
>
CreateDataBuff(DataArray, pIconGroup, CountIcons, size)
<
static IconData
VarSetCapacity(IconData, size)
DllCall(«RtlMoveMemory», Ptr, &IconData, Ptr, pIconGroup, Ptr, 6)
offset := 6
Loop % CountIcons
<
DllCall(«RtlMoveMemory», Ptr, &IconData + offset, Ptr, pIconGroup + offset — 2*(A_Index — 1), Ptr, 12)
NumPut(DataArray[A_Index].offset, &IconData + offset + 12, «UInt»), offset += 16
DllCall(«RtlMoveMemory», Ptr, &IconData + DataArray[A_Index].offset, Ptr, DataArray[A_Index].ptr, Ptr, DataArray[A_Index].size)
>
Return &IconData
>
Data2icoFile(pData, Dest, size, idx)
<
static i = 0
SplitPath, Dest,, Dir, Ext, OutNameNoExt
if !FileExist(Dir)
<
FileCreateDir, % Dir
if ErrorLevel && Text := «Невозможно создать папку » Dir «`nОшибка » A_LastError
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)
>
(!idx) ? Dest := (Ext ? SubStr(Dest, 1, -(StrLen(Ext) + 1)) : Dest) . «(» . ++i . «)» . (Ext ? «.» . Ext : «»)
if !(File := FileOpen(Dest, «w»)) && Text := «Невозможно открыть файл » Dest «на запись`nОшибка » A_LastError
Return, 0, DllCall(«MessageBox», Ptr, 0, Str, Text, Str, «», UInt, 0)