Модераторы: JackYF, Любитель
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt файлы ресурсов *.rcc, чем распаковать/просмотреть? 
V
    Опции темы
zedx
Дата 16.12.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Подскажите, есть ли какой-нибудь редактор/распаковщик/вьювер qt-ресурсов (бинарных *.rcc)? Или, в крайнем случае, подскажите где найти описание формата ресурсов чтоб можно было сделать свой распаковщик.

И ещё, может кто-нибудь выложить сам rcc.exe последней (4.7.1) версии?
PM MAIL   Вверх
SABROG
Дата 20.12.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(zedx @  16.12.2010,  19:39 Найти цитируемый пост)
Подскажите, есть ли какой-нибудь редактор/распаковщик/вьювер qt-ресурсов (бинарных *.rcc)?

Сама утилита rcc не предоставляет возможности распаковать файлы ресурсов, однако в Qt есть метод
Код

QResource::registerResource("/path/to/myresource.rcc");


Который позволяет зарегистрировать ресурс и использовать файлы, которые в нем находятся. Думаю сохранить их через QFile не составит труда.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zedx
Дата 21.12.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Т.е. чтобы распаковать ресурс мне надо его вначале статически прилинковать к проекту а затем перекомпилировать его? А как-то динамически это можно сделать, чтоб я мог распаковывать все файлы в заданной директории по маске *.rcc? 

Это сообщение отредактировал(а) zedx - 21.12.2010, 13:13
PM MAIL   Вверх
SABROG
Дата 21.12.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(zedx @  21.12.2010,  12:50 Найти цитируемый пост)
Т.е. чтобы распаковать ресурс мне надо его вначале статически прилинковать к проекту а затем перекомпилировать его? А как-то динамически это можно сделать, чтоб я мог распаковывать все файлы в заданной директории по маске *.rcc? 

Ничего линковать не нужно. Просто укажи путь к файлу.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zedx
Дата 21.12.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Получилось, за единственным исключением, что не распаковались локализованные ресурсы (т.е. распаковались ресурсы только для текущей локали).
Код

#include <QResource>
#include <QDir>
#include <QFile>
#include <iostream>

int main(int argc, char *argv)
{  
    QString mask("*.rcc");
    QStringList filter(mask);
    QDir rccFilesDir("./"); //поиск в текущей директории
    rccFilesDir.setFilter(QDir::Files);
    rccFilesDir.setNameFilters(filter);

    foreach (QString rccFoundFile, rccFilesDir.entryList())
    {
        std::cout << "Found: ";
        std::cout << rccFoundFile.toLocal8Bit().data();
        std::cout << "\n";

        QResource::registerResource(rccFoundFile); //подключаем ресурс

        QString resPath("./res/"+ rccFoundFile + "/");
        rccFilesDir.mkpath(resPath); //сюда будем распаковывать

        QDir rccVirtualDir(":/");
        rccVirtualDir.addSearchPath(":",":/");

        foreach (QString rccResName, rccVirtualDir.entryList())
        {
             std::cout << "Res found: ";
             std::cout << rccResName.toLocal8Bit().data();
             std::cout << "\n";
             std::cout << "Try save it...";
             std::cout << "\n";

             QString rccUnpackRes(resPath + rccResName);
             QString rccPackRes(":/" + rccResName);
             QFile resfile(rccPackRes);
             resfile.open(QIODevice::ReadWrite);
             resfile.copy(rccPackRes, rccUnpackRes); // сохраняем
             resfile.close();

             std::cout << "Res saved to file: ";
             std::cout << rccUnpackRes.toLocal8Bit().data();
             std::cout << "\n";
        }

       QResource::unregisterResource(rccFoundFile); //отключаем ресурс
    }

   std::cout << "Ok! Press Enter to Exit...";
   std::cin.get();
}


Это сообщение отредактировал(а) zedx - 21.12.2010, 16:18
PM MAIL   Вверх
zedx
Дата 23.12.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Пытаюсь прикрутить к rcc.exe функционал распаковки ресурсов, но сборка тормозит с ошибками undefined reference:

Цитата

Выполняется сборка проекта rcc...
Настройки не изменились, этап qmake пропускается.
Запускается "C:/Qt/qtcreator-2.0.1/mingw/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `C:/Qt/4.7.1/src/tools/rcc'

c:\qt\4.7.1\bin\qmake.exe -spec ..\..\..\mkspecs\win32-g++ -o Makefile rcc.pro

mingw32-make: Leaving directory `C:/Qt/4.7.1/src/tools/rcc'

mingw32-make: Entering directory `C:/Qt/4.7.1/src/tools/rcc'

C:/Qt/qtcreator-2.0.1/mingw/bin/mingw32-make -f Makefile.Release

mingw32-make[1]: Entering directory `C:/Qt/4.7.1/src/tools/rcc'

g++ -c -O2 -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_RCC -DQT_BOOTSTRAPPED -DQT_LITE_UNICODE -DQT_TEXTCODEC -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODECS -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_QOBJECT -DQT_NO_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABLES -DQT_NO_USING_NAMESPACE -DQT_NODLL -I"." -I"." -I"." -I"..\..\..\include" -I"..\..\..\include\QtCore" -I"..\..\..\include\QtXml" -I"..\..\xml" -I"..\..\..\mkspecs\win32-g++" -o tmp\obj\release_static\revers.o revers.cpp

g++ -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -o ..\..\..\bin\rcc.exe tmp/obj/release_static/rcc.o tmp/obj/release_static/revers.o tmp/obj/release_static/main.o  -L"c:\Qt\4.7.1\src\tools\bootstrap\release" -lbootstrap -luser32 

mingw32-make[1]: Leaving directory `C:/Qt/4.7.1/src/tools/rcc'

mingw32-make: Leaving directory `C:/Qt/4.7.1/src/tools/rcc'

tmp/obj/release_static/revers.o:revers.cpp:(.text+0x1127): undefined reference to `QDir::addSearchPath(QString const&, QString const&)'

tmp/obj/release_static/revers.o:revers.cpp:(.text+0x1f67): undefined reference to `QResource::registerResource(QString const&, QString const&)'

tmp/obj/release_static/revers.o:revers.cpp:(.text+0x21a3): undefined reference to `QResource::unregisterResource(QString const&, QString const&)'


collect2: ld returned 1 exit status

mingw32-make[1]: *** [..\..\..\bin\rcc.exe] Error 1

mingw32-make: *** [release] Error 2

Процесс "C:/Qt/qtcreator-2.0.1/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта rcc (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"

Т.е. не нравятся строчки:
Код

dir.addSearchPath(QLatin1String(":"), dir.path());

Код

QResource::registerResource(rccFile);

Код

QResource::unregisterResource(rccFile);


Я что-то где-то не подключил? Если собирать проект самостоятельно, то всё компилируется без вопросов, хотя в итоге и получаем зависимость от длл-ок. Сам же rcc.exe, если компилировать без моей вставки, зависимостей не имеет. Т.е. rcc имеет какие-то хитрые настройки из-за которых и не хочет линковаться мой код? 

В аттаче код, что я подключаю.

Это сообщение отредактировал(а) zedx - 23.12.2010, 10:19

Присоединённый файл ( Кол-во скачиваний: 33 )
Присоединённый файл  rcc_revers.zip 1,76 Kb
PM MAIL   Вверх
zedx
Дата 23.12.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



В общем, поступил наоборот - взял исходники rcc (голые *.cpp и *.h, без каких-либо настроек) и добавил их в свой проект. Вот тогда и скомпилировалось без ошибок.

В аттаче "расширенная" версия компилятора ресурсов (+ src) с дополнительным ключом -reverse, по которому производится распаковка всех бинарных (*.rcc) файлов ресурсов в текущей директории. 
Распакованные ресурсы сортируются по отдельным папочкам, в соответствии с именем исходного rcc файла. 
Дополнительно генерируются файлы *.qrc и файл make.bat для обратной сборки распакованных ресурсов в бинарные rcc файлы. 

Весь прежний функционал утилитки естественно сохранён.


Присоединённый файл ( Кол-во скачиваний: 65 )
Присоединённый файл  RccExtended.zip 565,87 Kb
PM MAIL   Вверх
Malachi
Дата 13.4.2011, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Спасибо за полезную утилиту, но при использовании её возникли трудности. Если в самом *.rcc файле сами интересующие меня файлы (текстурки из одной игры) запрятаны слишком глубоко, то утилита их не воспринимает.

То есть если там один уровень вложения (resources.rcc\fonts\vera.ttf), то утилита его видит и извлекает. 

Если же уровней больше одного (resources.rcc\images\cards\image.png), то всё что я получаю на выходе - это пустую папку images\cards, без малейшего намёка на содержимое в ней. А содержимое должно быть, так как исходный файл весит многие мегабайты, а шрифты из всего этого на 600 Кб еле тянут.

Собственно вопрос: есть ли какой-то спосбо расширить функционал утилиты, дабы можно было доставать файлы, запрятанные глубже одного уровня? Заранее спасибо.

Это сообщение отредактировал(а) Malachi - 14.4.2011, 00:48
PM MAIL   Вверх
zedx
Дата 20.4.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Да, закрался небольшой бажек. Поправил.

Присоединённый файл ( Кол-во скачиваний: 247 )
Присоединённый файл  RccExtended.v2.zip 558,89 Kb
PM MAIL   Вверх
p943845
Дата 1.3.2019, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.3.2019

Репутация: нет
Всего: нет



Цитата(zedx @ 20.4.2011,  17:16)
Да, закрался небольшой бажек. Поправил.

Благодарю!  smile 
PM MAIL   Вверх
zedx
Дата 14.1.2020, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Обновил утилиту до актуальной версии rcc (5.15.0) - добавилась поддержка бинарных форматов версий 2 и 3.

Бинарник и сорцы доступны на гитхабе: https://github.com/zedxxx/rccextended
PM MAIL   Вверх
Google
  Дата 26.1.2020, 14:04 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.