Подключение ресурсов
Модератор: Модераторы разделов
-
Carbon
- Сообщения: 22
- ОС: Xubuntu 8.10
Подключение ресурсов
Здравствуйте, товарищи.
Есть программа, которая должна, к примеру, загружать картинку. Но чё-то не очень хочется чтобы картинка валялась рядом с программой. Можно ли как-нибудь присоединить её к приложению? И как потом её использовать?
ЗЫ Сразу предупрежу, я не пользуюсь qt, поэтому можно как-нибудь сделать в командной строке?
Есть программа, которая должна, к примеру, загружать картинку. Но чё-то не очень хочется чтобы картинка валялась рядом с программой. Можно ли как-нибудь присоединить её к приложению? И как потом её использовать?
ЗЫ Сразу предупрежу, я не пользуюсь qt, поэтому можно как-нибудь сделать в командной строке?
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подключение ресурсов
Вообще-то в юниксах это не принято. Но если очень хочется - то можно. Сохраняем картинку в формате xpm (например, гимпом), пусть это будет test.xpm. Потом пишем
Дальше работаем с переменной test_xpm (она объявлена в самом test.xpm). Формат данных довольно простой, с ним можно даже вручную работать, ну или использовать libXpm.
Код: Выделить всё
...
#include "test.xpm"
...Дальше работаем с переменной test_xpm (она объявлена в самом test.xpm). Формат данных довольно простой, с ним можно даже вручную работать, ну или использовать libXpm.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
Carbon
- Сообщения: 22
- ОС: Xubuntu 8.10
Re: Подключение ресурсов
А принято отдельно загружать?
Спасибо. Дальше я сам найду. Главное, узнал в какую сторону копать.
-
Carbon
- Сообщения: 22
- ОС: Xubuntu 8.10
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подключение ресурсов
Да, принято отдельно загружать. По простой причине: так проще - и писать, и собирать программу, и модифицировать.
Если не картинку - надо каким-нибудь образом сконвертировать файл в C'шное объявление переменной, типа 'static char* my_data = ...'. Xpm-формат для картинок хорош как раз тем, что xpm-файл представляет собой валидный исходник на C.
Если используете libXpm - соответственно, она должна быть установлена на целевой системе. Но практически, она почти везде ставится по умолчанию.
В принципе, есть еще один вариант: линковщик ld, вообще говоря, позволяет подлинковать в результирующий elf-бинарник любые данные, но выяснить из запущенной программы, куда эти данные загрузились - отдельная заморочка.
Если не картинку - надо каким-нибудь образом сконвертировать файл в C'шное объявление переменной, типа 'static char* my_data = ...'. Xpm-формат для картинок хорош как раз тем, что xpm-файл представляет собой валидный исходник на C.
Если используете libXpm - соответственно, она должна быть установлена на целевой системе. Но практически, она почти везде ставится по умолчанию.
В принципе, есть еще один вариант: линковщик ld, вообще говоря, позволяет подлинковать в результирующий elf-бинарник любые данные, но выяснить из запущенной программы, куда эти данные загрузились - отдельная заморочка.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
MiK13
- Сообщения: 1307
- ОС: Linux Debian
Re: Подключение ресурсов
А что если просто добавить файл в конец файла исполняемой программы?
-
brejnev
- Сообщения: 105
- ОС: OpenSUSE 11.1
Re: Подключение ресурсов
А почему бы не написать некоторый класс( или функцию) который бы командовал ресурсами. Например
А уж сам PictureManager будет знать откуда брать ресурсы.
ЗЫ: извиняйте, если с синтаксисом ошибся, давно не писал на С++
Код:
static int MY_PICTURE = 1;// для каждого контакта задаем свою константу
...
class PictureManager{
static ostream& getPuicture(int){...}
}
...
ostream o = PictureManager.getPicture( MY_PICTURE );А уж сам PictureManager будет знать откуда брать ресурсы.
ЗЫ: извиняйте, если с синтаксисом ошибся, давно не писал на С++
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подключение ресурсов
MiK13 Можно, но как из самой программы до них потом добраться? Загрузчик в память их не загрузит, так что придётся самому открывать собственный бинарник и разбираться, где там кончается программа и начинаются данные (для этого придётся разбирать elf-заголовок). Длинно.
brejnev Вобщем, логично. Просто реализация этого класса/функции будет самая простая, если ресурсы просто загружать из лежащих на диске файлов.
brejnev Вобщем, логично. Просто реализация этого класса/функции будет самая простая, если ресурсы просто загружать из лежащих на диске файлов.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
MiK13
- Сообщения: 1307
- ОС: Linux Debian
Re: Подключение ресурсов
Portnov писал(а): ↑14.10.2008 16:23MiK13 Можно, но как из самой программы до них потом добраться? Загрузчик в память их не загрузит, так что придётся самому открывать собственный бинарник и разбираться, где там кончается программа и начинаются данные (для этого придётся разбирать elf-заголовок). Длинно.
А зачем разбирать elf-заголовок? Достаточно в конец файла программы с прикреплёнными данными дописать реальный размер (например, в виде int) файла программы (программа для этого будет очень простая).
А прочитать прикреплённые данные -- 5 строк (не считая проверок на ошибки и корректность):
Код: Выделить всё
fp=open(argv[0],O_RDONLY);
lseek(fp,-4,SEEK_END);
read(fp,&data_pos,4); // Прочитать позицию данных
lseek(fp,data_pos,SEEK_SET);
read(fp,buf_data,DATA_SIZE);-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Подключение ресурсов
Хехе. Да, можно и так. Правда, я подозреваю (не уверен), что многие антивирусы на такую программу завопят (это типичный приём прикрепления вируса к бинарнику-жертве, правда древний очень) 
Ну и загрузить ресурсы из отдельного файла всё равно проще
Ну и загрузить ресурсы из отдельного файла всё равно проще
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
MiK13
- Сообщения: 1307
- ОС: Linux Debian
Re: Подключение ресурсов
Конечно проще. Более того, если ресурсы в отдельных файлах, то, кроме непосредственного чтения в переменные программы, их можно обрабатывать и различными внешними программами (через system и др.). И при этом изменения этого ресурса не потребует никаких манипуляций с самой программой.
Но если автору хочется, чтобы ресурс составлял единое целое с файлом программы, то возможны и варианты, предложенные выше.
Включение объекта в код программы -- наиболее корректный способ. Его недостаток -- для изменения ресурса надо перекомпилировать программу.
Добавление файла ресурса в конец программы -- можно к готовой программе прикреплять разные ресурсы. Недостаток -- нужна дополнительная программа для такого прикрепления.
Код: Выделить всё
open(argv[0],O_RDWR);По поводу того, что
интересно бы проверить.
Но вирусы, кроме добавления своего тела в конец файла программы должны также сделать педачу ему управления, а в данном случае этого не будет.
Хотя... если антивирус обнаружит в теле программы код чтения собственного файла за пределами того, что описано в заголовке...
-
/dev/random
- Администратор
- Сообщения: 5498
- ОС: Gentoo
-
Tosh2o
- Сообщения: 12
- ОС: Win_XPSP1; Mandriva_LE2005
Re: Подключение ресурсов
http://www.linuxjournal.com/content/embedd...ld-version-5967
очень хорошая статья о том как линковать и использовать файлы в программку
вкратце если ссылка неработает
конвертируем нужный нам файлик в бинарный обьект
линкуем основную программку вместе с новоиспеченным обьектом
пример использования:
очень хорошая статья о том как линковать и использовать файлы в программку
вкратце если ссылка неработает
конвертируем нужный нам файлик в бинарный обьект
user@host
# objcopy --input binary \
--output elf32-i386 \
--binary-architecture i386 data.txt data.oлинкуем основную программку вместе с новоиспеченным обьектом
user@host
# gcc main.c data.oпример использования:
Код:
#include <stdio.h>
extern char _binary_data_txt_start;
extern char _binary_data_txt_end;
main()
{
char* p = &_binary_data_txt_start;
while ( p != &_binary_data_txt_end ) putchar(*p++);
}