Сергій Шибаєв - використання файлу ресурсів (

При складанні проекту в Windows файл визначення ресурсів (.rc) компілюється в двійковий вигляд (.res) і на етапі компонування підключається до exe-файлу, фактично прописуючись після запуску десь в оперативній пам'яті. Нагадаю, що визначити місце розташування шуканого ресурсу дозволяє функція:

Технологія налагоджена, сумніву не піддається. Уже на цьому етапі в Linux виникає кілька питань. По-перше, чим відкомпілювати вихідний файл ресурсів в двійковий формат? По-друге, як підключити його до формованому виконуваного файлу проекту? І, по-третє, як знайти і прочитати у файлі потрібний ресурс?

Крок 1. Компілюємо файл ресурсів

Найпростіший крок. З цим завданням цілком справляється утиліта wrc (Wine Resource Compiler), яка вміє компілювати файл ресурсів в 16- або 32-розрядний двійковий формат. Застосування просте:

Крок 2. Підключення файлу ресурсів

Говоримо, що на вході у нас двійковий файл (-I binary), на виході хочемо отримати файл у форматі об'єктних файлів на 32-розрядної платформі x86 (-O elf32-i386), причому він повинен виглядати як "виконуваний" файл (-B i386). У такому вигляді його вже можна буде підключати до проекту:

Я використовую cmake, тому в мій CMakeLists.txt додав кілька рядків:

На цьому майже вся магія закінчується. Залишається нез'ясованим лише одне питання: як знайти ресурси в готовому executable файлі? Компоновщик, виконавши свою роботу, великодушно залишив в зібраному файлі кілька назв

За цими мітками тепер можна прочитати вміст файлу ресурсів.

Крок 3. Пошук і читання ресурсів в програмі

Для початку визначимо змінні, відповідні вищеописаним мітках компоновщика:

При визначенні використовую тип char, оскільки в моєму проекті в ресурсах зберігаються тільки посилання на текстові файли у форматі xml. Додатково визначу звичні типи, невідомі Linux, виключно для зручності роботи

Все готово для пошуку потрібного ресурсу, крім того, що в Linux відсутня відповідна функція, яку доведеться виготовити самостійно. Оскільки всі ресурси, які були підключені до нашого проекту, збережені у форматі файлу res, непогано було б для початку дізнатися його формат. Новомосковський в MSDN, що в основі формату лежить структура RESOURCEHEADER

Під Linux я також перевизначив типи

і додав константу, що позначає тип ресурсу: в моєму випадку це прості дані

Отже, в файлі ресурсів після структури RESOURCEHEADER слідують дані, розмір яких становить DataSize байт. Цієї інформації майже досить для того, щоб распотрошить його повністю. Остання засада, яка чекає на шляху до мети: кожен ресурс, що включає структуру і самі дані, вирівняний по подвійному слову. Тобто, в разі якщо його розмір в байтах не кратний чотирьом, в хвіст до нього дописується відсутню кількість нульових символів. У мене вийшла така функція для пошуку ресурсу типу RC_DATA по заданому імені

І більш ніщо не заважає прочитати вміст пам'яті в свою змінну

Resource ::

Безумовно, розглянутий приклад використання в Linux звичних для Windows файлів визначення ресурсів досить примітивний, оскільки "заточений" тільки під один тип даних (RT_RCDATA). Однак цілком являє собою основу дитячої пірамідки з уже одягненим на неї невеликим колечком, поверх якого можна накидати ще багато всього.