Обзор программы

Типы ресурсов

Ресурсы в любом 32-битном исполняемом файле Windows 95/98/ME/NT/2000 (включая EXE, DLL, SCR, OCX и CPL) можно просмотреть, выбрав Файл→Открыть из главного меню Resource Hacker™. DLL-подобные файлы, такие как AX (ActiveMovie Proxy), FLT (Graphic Import Filter), HPA (Hewlett-Packard Printer Applet), PCI (Peripheral Component Interconnect), TSP (Microsoft Remote Service Provider) и VWP (Voxware MetaVoice Plug-In) можно также просмотреть. Полный список ресурсов файла будет отображаться в виде древовидной структуры. Дерево ресурсов может быть полностью развёрнуто или свёрнуто выбором пункта меню Вид→Развернуть всё или Вид→Свернуть всё соответственно.



Элементы ресурсов определяются его типом, именем и идентификатором языка.

Ресурсы сгруппированы в типах ресурсов. Существует несколько предопределённых типов ресурсов (icon, cursor, bitmap, dialog, menu, rcdata и т.д.), но программист также может задать другие типы ресурсов.

Элементы ресурсов находятся в пределах их соответствующих типов ресурсов и имеют имя ресурса, которое уникально в пределах этого типа. Это имя обычно либо целое число, либо текстовая строка; однако, некоторые типы ресурсов (например "String Table") позволяют только целые числа для имён.

Каждый именованный ресурс может иметь более одного определяемого языком элемента, что позволяет программе иметь несколько языков. Под каждым именем ресурса в дереве ресурсов находится хотя бы один элемент языкового ресурса. Идентификатор языка является текстовым значением целого числа сделанным из первичного (6 младших битов) и вторичного (10 старших битов) идентификаторов языка, который определяется Windows (если элемент языка нейтральный, то это значение равно 0).

Курсор и иконки

Курсоры и иконки требуют особого упоминания, так как информация их ресурса разделена между двумя типами ресурсов: "Cursor" & "Cursor Group"; и "Icon" & "Icon Group" соответственно.

Каждая иконка (или курсор) имеет несколько изображений (то есть группы связанных изображений иконок): 16x16 пиксель (16 цветов), 32x32 пиксель (16 цветов), 16x16 пиксель (256 цветов), и т.д. Изображение, которое фактически используется операционной системой зависит от затребованного размера (маленькая или большая иконка) и установленной глубины цвета монитора. Тип ресурса "Icon Group" содержит заголовочную информацию иконки - собственное имя изображения, а также его размер и глубину цвета. Однако фактически изображение хранится в типе ресурса "Icon".



например: Icon = LOADICON(hInstance, ‘#102’)

Эта функция Windows API сначала находит заголовочную информацию для "Icon Group" ID 102. Затем, если более одной иконки перечислено в заголовочной информации, операционная система выбирает наилучшее изображение в списке.

Важно понимать, что при замене файловой иконки (или курсора) иконка целиком заменяется с заголовочной информацией (в "Icon Group") и всеми её собственными иконками (в "Icon").

Однако, оба варианта: одиночные иконки, и группы иконок могут быть извлечены из ресурса в файл-иконку (*.ico): если в дереве ресурсов выбран ресурс в типе "Icon", то иконка будет сохранена как одиночная. Если же выбран ресурс в типе "Icon Group", то все иконки, принадлежащие выбранному ресурсу будут сохранены в файл иконки.

Просмотр ресурсов

Просто выберите ресурс из дерева ресурсов (если файл был открыт). Ресурс будет отображаться в виде:

Графическое изображение



Декомпилированный текст



Комбинация декомпилированного текста и скомпилированной формы для предпросмотра



Данные в сыром виде (шестнадцатеричный слева и ASCII текст справа)



Примечание: Программы, скомпилированные с помощью Borland VCL (к примеру, многие программы на Delphi) обычно не имеют ресурсов Dialog, Menu или Accelerator, но хранят эту информацию в "RCData".

Извлечение (сохранение) ресурсов

Ресурсы иконки, рисунки, курсоры, меню, диалоги, таблицы строк, таблицы сообщений, быстрые клавиши, формы Borland и информация о версии могут быть все сохранены в файл в их собственном формате, будь то изображение или в виде текстовых файлов ресурса (*.rc). Сначала выбираем ресурс в дереве, затем в меню выбираем Действие→Сохранить [Имя ресурса] .... Чтобы сохранить ресурс в скомпилированный файл ресурсов (*.res): выберите в меню Действие→Сохранить ресурс как *.res файл .... Чтобы сохранить одиночный ресурс как бинарный файл: выберите в меню Действие→Сохранить ресурс как бинарный файл ....

Чтобы сохранить в файл все ресурсы определенного типа, выберите тип в дереве и затем выберите в меню Действие→Сохранить [ Тип ресурса ] ресурс ....

Чтобы сохранить все ресурсы в файл, выберите в меню Действие→Сохранить все ресурсы.... Ресурсы, которые не могут быть декомпилированы в текстовое представление ресурсов (как например изображения) будут преобразованы в свои собственные файловые форматы и сохранены в той же папке, что и текстовое представление ресурсов (например Cursor_1.cur, Cursor_2.cur, Bitmap_1.bmp, Icon_1.ico). Ресурсы с неопознанными форматами данных будут сохранены как *.bin файлы.

Модифицирование (замена) ресурсов

Во-первых, предупреждение или даже два:

Если вы собираетесь модифицировать ресурсы, то сначала сделайте резервную копию оригинального файла. В дальнейшем, тщательно проверяйте исправность нового файла. Чтобы облегчить эту операцию, всякий раз, когда файл изменен и сохранен, Resource Hacker™ будет автоматически делать резервную копию исходного файла (например в Explorer_original.exe) перед тем как сохранить.

В ресурсах Dialog и Menu, удаление элементов управления или изменение их идентификаторов, скорее всего, будет приводить к краху программы. Однако изменение надписей элемента управления, обычно безопасная операция, также как и изменение координат его расположения, размера и стилей отображения. Добавление нового элемента управления вряд ли вызовет проблемы. Переименование ресурсов также может привести к краху программы.

Использование встроенного редактора для изменения текстовых ресурсов:

Ресурсы диалоги, меню, таблицы строк, таблицы сообщений, быстрые клавиши и формы Borland могут быть легко отредактированы и перекомпилированы с помощью встроенного редактора ресурсов. Внутренний компилятор поддерживает метасимволы - \t , \n , \\ , \" и \000 .. \377 - в строках ресурсов, представляющих собой табуляцию, новую строку, обратный слеш, двойные кавычки и восьмеричный байт-код соответственно. Конструкция #define также поддерживается. Просто отредактируйте отображаемый текстовый ресурс, и нажмите кнопку Компилировать. Модифицированный скомпилированный ресурс будет отображён. Любые ошибки, возникающие во время компиляции будут выводится в консоль.



Элементы управления ресурса Dialog могут быть изменены в размере и/или перемещены, и это автоматически сопровождается изменениями в текстовом представлении ресурса. Преобразование между пикселями экрана и единицами измерения диалога будет сделано автоматически.

Выберите элемент управления кликом на нём в отображаемом макете этого диалога. Кроме того, могут быть использованы клавиши Tab или Shift-Tab для выбора следующего или предыдущего элемента управления соответственно. Выбранный элемент управления будет обозначен маркерами изменения размера.

Чтобы переместить элемент управления без изменения размера, выберите его кликом мыши и перетащите в новое расположение. Клавиши со стрелками также можно использовать для перемещения элемента управления, когда он был выбран.



Элемент управления может быть изменен в размере путем нажатия и перетаскивания одного из его маркеров изменения размера. Кроме того, клавиши со стрелками с удерживаемой нажатой клавишей Shift могут быть использованы для изменения размера элемента управления.



Клавиша Escape (Esc) скрывает отображаемый макет диалогового окна.

Если элемент управления не может быть выбран кликом, то он, вероятно, перекрывается другим элементом управления. Элементы управления, которые объявлены в текстовом представлении ресурса ниже других элементов управления, на самом деле создаются в диалоговом окне выше своих предшественников (в порядке объявления в ресурсе) если на плоскости диалогового окна их расположения совпадают. Чтобы переместить или изменить размер перекрываемого элемента управления, нужно переместить или уменьшить размер перекрывающего элемента или изменить порядок объявления элементов управления в текстовом представлении ресурса. Редактор элемента управления (Control Editor) (см. ниже) также может быть использован для лёгкого изменения очерёдности следования элементов управления (см. поле "Z-порядок").

Редактор диалога может быть открыт из контекстного меню, появляющееся при клике правой кнопки мыши на элементе макета диалога. Редактор элемента управления (Control Editor) может быть открыт из того же контекстного меню.









Также могут быть добавлены новые элементы управления. Редактор элемента управления поддерживает практически все стандартные (Microsoft) и распространенные классы элементов. Пользовательские классы также могут быть добавлены во встроенный список классов, путём аккуратной правки текстового файла "Dialog.def", который находится в той же папке что и Resource Hacker™. Кнопки панели инструментов позволяют выбрать наиболее часто используемые элементы управления. Координаты левого верхнего угла элемента управления будут заполнены автоматически и эти значения будут соответствовать координатам, в которых было вызвано контекстное меню правой кнопкой мыши, чтобы открыть это диалоговое окно.



Замена изображений:

Если заменяемый ресурс является иконка, курсор или рисунок, источником могут быть файлы *.ico, *.cur или *.bmp соответственно, или выберите ресурсы из *.res или другого *.exe файла. Выберите в меню Действие→Заменить иконку (курсор / рисунок).





Замена ресурсов отличных от изображений:

Ресурсы отличные от изображений также могут быть заменены. Заменяемые ресурсы должны быть не только того же типа, но и с таким же именем ресурса. Выберите в меню Действие→Заменить другой ресурс ....



Примечание: Так как *.res файлы могут содержать множество ресурсов, то в диалоге добавления и замены ресурса отображается дерево ресурсов, так чтобы можно было выбрать конкретный ресурс в *.res файле. При добавлении или замене ресурсов из других типов файлов (не *.res), тип и имя ресурса должны быть введены вручную. Если поле "Язык ресурса" останется незаполненным, то предполагается нейтральный язык (0).

Обновление всех ресурсов ресурсами из *.res файла:

Также ресурсы могут быть заменены всеми совпадающими ресурсами, находящимися во внешнем *.res файле. Ресурс исходного файла (exe, dll) будет заменён ресурсом из внешнего *.res файла, только если он имеет такой же ресурс (тип, имя, язык). Выберите в меню Действие→Обновить все ресурсы ....

После всех проделанных модификаций файл можно сохранить, выбрав в меню Файл→Сохранить как.

Добавление ресурсов

Ресурс можно добавить в исполняемый файл, только если в нём нет ресурса с тем же типом, именем, языком. Выберите в меню Действие→Добавить новый ресурс ....

Добавление ресурсов позволяет программе поддерживать несколько языков.
(Примечание: Windows 95/98 не использует несколько языковых ресурсов, эта особенность WindowsNT. Я предполагаю, что Windows98 просто выбирает первый ресурс, если имеется более одного языкового ресурса.)

В качестве примера:
* Задача: Добавить французский перевод Dialog 30757 в Samples.dll.
* Решение:
1. Откройте Samples.dll и выберите Dialog 30757.
Язык этого ресурса в данный момент LANG_NEUTRAL, SUBLANG_NEUTRAL.
Примечание: Если перевод не является западным языком (например русский, китайский и т.д.), то шрифт встроенного редактора необходимо изменить для поддержки этого языка.
2. В текстовом представлении ресурса, измените значение поля языка (напротив LANGUAGE) на LANG_FRENCH, SUBLANG_FRENCH (кстати, Изменить язык [...] имеет тот же эффект), и переведите текст поля заголовка (напротив CAPTION) и каждый элемент управления (напротив CONTROL) на французский язык. Нажмите кнопку Компилировать.

3. Сохраните ресурс в *.res файл (например "30757_french.res").
4. Закройте Samples.dll без сохранения и откройте его снова.
Dialog 30757 все ещё будет LANG_NEUTRAL, SUBLANG_NEUTRAL.
5. Выберите в меню Действие→Добавить новый ресурс и откройте файл "30757_french.res", который только что был создан.
6. Выберите Dialog 30757, который теперь имеет идентификатор языка 1036 (французский) и нажмите кнопку Добавить ресурс.
7. И наконец сохраните Samples.dll. Вуаля!



Подсказка: Изменение шрифта редактора Resource Hacker™ важно при просмотре или модификации ресурсов компилируемых в незападных языках (Выберите в меню Вид→Шрифт редактора...).

Добавление иконок или рисунков (например логотип компании и т.п.) позволяет им быть отображёнными в диалоговых окнах программы.

В качестве примера:
* Задача: Добавить иконку в стандартное диалоговое окно "Открыть файл".
* Решение:

1. Откройте "C:\Windows\System\ComDlg32.dll".
(Ресурс диалога "Открыть файл" размещается в выше указанной DLL с именем ресурса 1547.)
2. Тип ‘Icon Group’ интересует тем, чтобы убедится, что имя добавляемой иконки в ‘Icon Group’ ещё не используется. В ComDlg32.dll имена иконок в диапазоне 528...539, таким образом может использоваться любое другое целое число или строка из букв и цифр. (Не беспокойтесь об именах ресурсов, используемых в типе ‘Icon’, так как Resource Hacker™ обеспечит иконки уникальными именами.)

3. Добавьте иконку в dll, выбрав в меню Действие→Добавить новый ресурс. В диалоговом окне добавления ресурса, откройте файл, который содержит новую иконку и дайте иконке уникальное имя (например NEWICON).
4. В дереве ресурсов выберите Dialog, имя 1547. Предполагая, что новая иконка с именем "NEWICON", добавьте следующий элемент управления в конце списка элементов управления в текстовом представлении ресурса:

CONTROL "NEWICON",-1,STATIC, SS_ICON|WS_CHILD|WS_VISIBLE,13,142,21,20



5. Скомпилируйте изменения и сохраните файл как ComDlgXX.dll.
6. Системный файл ComDlg32.dll не может быть заменён в работающей Windows; его можно заменить только в режиме DOS. Вы можете сделать это вручную следующим образом:
7. Перезагрузите Windows и загрузите в режиме MS-DOS.
8. Используйте команды DOS, чтобы переименовать старый ComDlg32.dll к примеру в ComDlg98.dll и далее переименуйте вновь созданный файл в ComDlg32.dll.
9. Перезагрузите компьютер в Windows. На этом всё. (Конечно, добавление рисунка (bitmap) вместо иконки вызвало бы меньше замешательств, поскольку нет "Bitmap Group" для рисунков.)





Кроме того, вы можете сделать замену файла следующим образом:
7. Создайте в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager мультистроковый (REG_MULTI_SZ) параметр PendingFileRenameOperations и присвойте ему значение из 4-х строк:

\??\C:\Windows\System32\ComDlg32.dll
!\??\C:\Windows\System32\ComDlg98.dll
\??\C:\Windows\System32\ComDlgXX.dll
!\??\C:\Windows\System32\ComDlg32.dll


Формат этой записи следующий:

\??\путь1_к_файлу_до_переименования
!\??\путь1_к_файлу_после_переименования
\??\путь2_к_файлу_до_переименования
!\??\путь2_к_файлу_после_переименования
\??\путь3_к_файлу_для_удаления

\??\путь4_к_файлу_для_удаления


Windows автоматически обработает эту информацию и удалит этот параметр из реестра. Как вы заметили, в выше указанном примере показан формат удаления файла при загрузке, где вместо нового имени файла пустая строка. Так как в текстовом режиме пустые строки удаляются, то откройте параметр из контекстного меню, выбрав "Изменить двоичные данные" и введите 00 00 в области шестнадцатеричных данных.

Вот пример готового reg-файла.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"PendingFileRenameOperations"=hex(7):5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,\
  57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,53,00,79,00,73,00,74,00,65,\
  00,6d,00,33,00,32,00,5c,00,43,00,6f,00,6d,00,44,00,6c,00,67,00,33,00,32,00,\
  2e,00,64,00,6c,00,6c,00,00,00,21,00,5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,\
  00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,53,00,79,00,73,00,74,00,\
  65,00,6d,00,33,00,32,00,5c,00,43,00,6f,00,6d,00,44,00,6c,00,67,00,39,00,38,\
  00,2e,00,64,00,6c,00,6c,00,00,00,5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,\
  57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,53,00,79,00,73,00,74,00,65,\
  00,6d,00,33,00,32,00,5c,00,43,00,6f,00,6d,00,44,00,6c,00,67,00,58,00,58,00,\
  2e,00,64,00,6c,00,6c,00,00,00,21,00,5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,\
  00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,53,00,79,00,73,00,74,00,\
  65,00,6d,00,33,00,32,00,5c,00,43,00,6f,00,6d,00,44,00,6c,00,67,00,33,00,32,\
  00,2e,00,64,00,6c,00,6c,00,00,00,00,00