Empaquetar imagenes , archivos etc.. en el ejecutable[c++]

Iniciado por jorge245, 4 Mayo 2018, 23:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

jorge245

Es que e visto juegos y programas que contienes sus archivos o algunos de ellos, dentro del ejecutable. algo asi como un Appimage.

Serapis

#1
Cualquier lenguaje de programación que se precie, dispone de 'recursos' que precisamente lo que hacen es eso que reclamas, empaquetar en el ejecutable (o quizás en un fichero aparte), los recursos que el propio ejecutable pueda necesitar, desde iconos, imágenes, cadenas de texto, hasta fuentes, etc...

Si el lenguaje que acostumbras a usar, no dispusiera de ello, o bien quieres apañártelas por tu cuenta de forma independiente, la mejor forma es disponerlo es:

1 Generar  el ejecutable y una vez hecho,
2 con otro programa (para ese reciso propósito), 'pegar detrás' los  diferentes recursos que precises, al tiempo vas generando una estructura de datos con la info precisa, que es lo que se endosa al final del ejecutable... el ejecutable debe estar diseñado para leer de sí mismo, del final esa estructura, reconocerla y saber interpretar su contenido.

sea tu ejecutable esto: cvbbmtur834
sea que quieres añadir 3 imágenes, (imaginemos que fueran así de grandes-pequeñas en realidad):  ert intghj poq245bmrt
sea que además quieres añadir un icono, por ejemplo: prty
sea además que guardas cierto contenido en texto, por ejemplo 74try5
sea que añades otras cosas, más... verás que es más de lo mismo.

Entonces te diseñas tu estructura:


enumeracion TiposDeRecursos
   RECURSO_TEXTO = 0
   RECURSO_ICONO = 1
   RECURSO_IMAGEN = 2
   ...etc...
fin enumeracion

Estructura recursos
   byte Tipo  // como enumeracion TipoDerecursos
   entero NumBytes
Fin estructura

Array de recursos rc(0 a 3 + 1 + 1 -1) //3 imagenes + 1 icono + 1 texto


Pegar detras del ejecutable: cvbbmtur834,ert,intghj,poq245bmrt,prty,74try5  
// las comas se ponen solamente para que se vea claramente la separación.
El array tendrá estos datos:
Rc(0).Tipo = 2          // imagen 1  
Rc(0).NumBytes= 3  // ert

Rc(1).Tipo = 2          // imagen 2  
Rc(1).NumBytes= 6  // intghj

Rc(2).Tipo = 2          // imagen 3  
Rc(2).NumBytes= 10   // poq245bmrt

Rc(3).Tipo = 1          // icono  
Rc(4).NumBytes= 4  // prty

Rc(4).Tipo = 0          // texto
Rc(4).NumBytes= 6  // 74try5

Pegas ahora el array detrás de todo.
y de momento queda así:
cvbbmtur834ertintghjpoq245bmrtprty74try5,2,3,3,6,2,10,1,4,0,6

Nuevamente las comas solo tienen el propósito de aclaración y los valores numéricos aquí son textuales, lógicamente deberían ser valores de 1 o más bytes, aquí para explicar de forma clara con texto legible, algún valor tiene 1 o 2 caracteres.
Finalmente pegas el tamaño de elementos del array, que es: 5   (3 imágenes + 1 icono + 1 texto)
Y así tu ejecutable será finalmente esto:
cvbbmtur834ertintghjpoq245bmrtprty74try523362101406,5

Tu ejecutable deberá ser capaz de leer del final un entero que identifica el tamaño del array que irá desde 0 hasta n-1
A continuación deberá ser capaz de leer más atrás de esa última posición precisamente el contenido de ese array.
Y finalmente partiendo de los valores de ese array y los desplazamientos razonados, el recurso que interese...

Realmente toda esa operatoria es más sencilla y cómoda programarla sobre un fichero aparte que sobre el propio ejecutable (podría además escribirlo justo en orden inverso, primero la cantidad del array, luego el contenido del array y luego cada recurso (eso sí éstos en el mismo orden que allí).

Pero sería un fichero aparte, y si es imprescindible que deba ser sobre el propio ejecutable, esa es la solución. Solamente recuerda que el propio ejecutable debe ser capaz de reconocerlo.
Y que para evitar errores, añade un 'magic' al final del propio fichero... si aparece el 'magic' tiene recursos incrustados, si no se olvidó añadirlos o el ejecutable fue alterado-dañado.
El 'magic' es casi cualquier cosa que tu pretendas que sea como significativo de 'contiene recursos al final del ejecutable según tu formato descrito', lo ideal es usar 4-8 caracteres específicos, que ni por casualidad puedan ser parte del contenido volcado, por ejemplo podría ser el texto: RECURSOS, así tu  ejecutable finalmente tendría el ejecutable, las 3 imágenes, 1 icono, 1 texto, el array de datos, el tamaño del array y el magic, y quedaría así al final:
cvbbmtur834ertintghjpoq245bmrtprty74try5233621014065RECURSOS

jorge245

Muchas gracias por responderme.y si puedes podrías por favor escribirme sobre como funciona eso del pegado atrás del ejecutable.

BloodSharp

Cita de: jorge245 en  7 Mayo 2018, 23:48 PMMuchas gracias por responderme.y si puedes podrías por favor escribirme sobre como funciona eso del pegado atrás del ejecutable.

Pero si lo explicó perfecto e incluso bién detallado, solo tenés que abrir el archivo de tu ejecutable y poner al final de este los datos de otros archivos... En tu programa que va a contener dichos archivos lo programás para que se lea así mismo para encontrar los datos de imágenes, sonidos, etc... y hacer a tu antojo lo que sea necesario.

Cita de: NEBIRE en  5 Mayo 2018, 01:33 AM(...)la mejor forma es disponerlo es:

1 Generar  el ejecutable y una vez hecho,
2 con otro programa (para ese reciso propósito), 'pegar detrás' los  diferentes recursos que precises, al tiempo vas generando una estructura de datos con la info precisa, que es lo que se endosa al final del ejecutable... el ejecutable debe estar diseñado para leer de sí mismo, del final esa estructura, reconocerla y saber interpretar su contenido.(...)


B#