Подключение ресурсов

Модератор: Модераторы разделов

Carbon
Сообщения: 22
ОС: Xubuntu 8.10

Подключение ресурсов

Сообщение Carbon »

Здравствуйте, товарищи.
Есть программа, которая должна, к примеру, загружать картинку. Но чё-то не очень хочется чтобы картинка валялась рядом с программой. Можно ли как-нибудь присоединить её к приложению? И как потом её использовать?

ЗЫ Сразу предупрежу, я не пользуюсь qt, поэтому можно как-нибудь сделать в командной строке?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Подключение ресурсов

Сообщение Portnov »

Вообще-то в юниксах это не принято. Но если очень хочется - то можно. Сохраняем картинку в формате xpm (например, гимпом), пусть это будет test.xpm. Потом пишем

Код: Выделить всё

...
#include "test.xpm"
...


Дальше работаем с переменной test_xpm (она объявлена в самом test.xpm). Формат данных довольно простой, с ним можно даже вручную работать, ну или использовать libXpm.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Carbon
Сообщения: 22
ОС: Xubuntu 8.10

Re: Подключение ресурсов

Сообщение Carbon »

Portnov писал(а):
13.10.2008 18:32
Вообще-то в юниксах это не принято.


А принято отдельно загружать?

Portnov писал(а):
13.10.2008 18:32
Дальше работаем с переменной test_xpm (она объявлена в самом test.xpm). Формат данных довольно простой, с ним можно даже вручную работать, ну или использовать libXpm.


Спасибо. Дальше я сам найду. Главное, узнал в какую сторону копать.
Спасибо сказали:
Carbon
Сообщения: 22
ОС: Xubuntu 8.10

Re: Подключение ресурсов

Сообщение Carbon »

Portnov писал(а):
13.10.2008 18:32
Сохраняем картинку в формате xpm (например, гимпом), пусть это будет test.xpm.


А вот, пока не забыл, а если нужно что-то другое прикрепить, не только картинку.
Да. И ещё. Что должно быть на компе у пользователя установлено, чтобы такая программа заработала?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Подключение ресурсов

Сообщение Portnov »

Да, принято отдельно загружать. По простой причине: так проще - и писать, и собирать программу, и модифицировать.

Если не картинку - надо каким-нибудь образом сконвертировать файл в C'шное объявление переменной, типа 'static char* my_data = ...'. Xpm-формат для картинок хорош как раз тем, что xpm-файл представляет собой валидный исходник на C.

Если используете libXpm - соответственно, она должна быть установлена на целевой системе. Но практически, она почти везде ставится по умолчанию.

В принципе, есть еще один вариант: линковщик ld, вообще говоря, позволяет подлинковать в результирующий elf-бинарник любые данные, но выяснить из запущенной программы, куда эти данные загрузились - отдельная заморочка.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MiK13
Сообщения: 1307
ОС: Linux Debian

Re: Подключение ресурсов

Сообщение MiK13 »

А что если просто добавить файл в конец файла исполняемой программы?
Спасибо сказали:
Аватара пользователя
brejnev
Сообщения: 105
ОС: OpenSUSE 11.1

Re: Подключение ресурсов

Сообщение brejnev »

А почему бы не написать некоторый класс( или функцию) который бы командовал ресурсами. Например

Код:

static int MY_PICTURE = 1;// для каждого контакта задаем свою константу ... class PictureManager{ static ostream& getPuicture(int){...} } ... ostream o = PictureManager.getPicture( MY_PICTURE );


А уж сам PictureManager будет знать откуда брать ресурсы.

ЗЫ: извиняйте, если с синтаксисом ошибся, давно не писал на С++ :)
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Подключение ресурсов

Сообщение Portnov »

MiK13 Можно, но как из самой программы до них потом добраться? Загрузчик в память их не загрузит, так что придётся самому открывать собственный бинарник и разбираться, где там кончается программа и начинаются данные (для этого придётся разбирать elf-заголовок). Длинно.

brejnev Вобщем, логично. Просто реализация этого класса/функции будет самая простая, если ресурсы просто загружать из лежащих на диске файлов.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MiK13
Сообщения: 1307
ОС: Linux Debian

Re: Подключение ресурсов

Сообщение MiK13 »

Portnov писал(а):
14.10.2008 16:23
MiK13 Можно, но как из самой программы до них потом добраться? Загрузчик в память их не загрузит, так что придётся самому открывать собственный бинарник и разбираться, где там кончается программа и начинаются данные (для этого придётся разбирать 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: Подключение ресурсов

Сообщение Portnov »

Хехе. Да, можно и так. Правда, я подозреваю (не уверен), что многие антивирусы на такую программу завопят (это типичный приём прикрепления вируса к бинарнику-жертве, правда древний очень) ;)

Ну и загрузить ресурсы из отдельного файла всё равно проще :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MiK13
Сообщения: 1307
ОС: Linux Debian

Re: Подключение ресурсов

Сообщение MiK13 »

Portnov писал(а):
15.10.2008 21:08
Ну и загрузить ресурсы из отдельного файла всё равно проще :)

Конечно проще. Более того, если ресурсы в отдельных файлах, то, кроме непосредственного чтения в переменные программы, их можно обрабатывать и различными внешними программами (через system и др.). И при этом изменения этого ресурса не потребует никаких манипуляций с самой программой.
Но если автору хочется, чтобы ресурс составлял единое целое с файлом программы, то возможны и варианты, предложенные выше.
Включение объекта в код программы -- наиболее корректный способ. Его недостаток -- для изменения ресурса надо перекомпилировать программу.
Добавление файла ресурса в конец программы -- можно к готовой программе прикреплять разные ресурсы. Недостаток -- нужна дополнительная программа для такого прикрепления.

Код: Выделить всё

open(argv[0],O_RDWR);
не проходит -- выдаёт ошибку Text file busy
По поводу того, что
Portnov писал(а):
15.10.2008 21:08
что многие антивирусы на такую программу завопят
интересно бы проверить.
Но вирусы, кроме добавления своего тела в конец файла программы должны также сделать педачу ему управления, а в данном случае этого не будет.
Хотя... если антивирус обнаружит в теле программы код чтения собственного файла за пределами того, что описано в заголовке...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: Подключение ресурсов

Сообщение /dev/random »

MiK13 писал(а):
16.10.2008 17:10
Хотя... если антивирус обнаружит в теле программы код чтения собственного файла за пределами того, что описано в заголовке...

...то решит, что это - самораспаковывающийся архив. Ибо они именно так и работают.
Спасибо сказали:
Аватара пользователя
Tosh2o
Сообщения: 12
ОС: Win_XPSP1; Mandriva_LE2005

Re: Подключение ресурсов

Сообщение Tosh2o »

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++); }
Спасибо сказали: