PDA

Ver la Versión Completa : Es bueno engordar con RES mi ejecutable?


Deiv
05-07-2006, 14:50:28
Mi duda es la siguiente, ¿Cuan bueno o No beneficioso es engordar una aplicación (ejecutable) de Delphi?, Todos sabemos, que por evitar ser pirateados algunos íconos, Imágenes, o Sonidos lo trabajamos con arcvhivos RES verdad?.

¿Cuan beneficioso sería introducir en un RES 200 íconos 32x32?
¿Cuan beneficioso sería introducir en un RES 200 imágenes BMP 64x64?
Y como adimento digamos unas 5 imágenes BMP grandes (800x600) para fondos y otros.

TOTAL = 405,

¿Tal vez no me quedaría otra que tenerlos en un directorio? pero con la probabilidad que más adelante lo usen éstas imágenes que me costó trabajar o con aquellos íconos construirlos?

Si hablé de una cantidad de 200, es por la sencilla razón de crear una Tabla Periódica Química y para otros trabajos jalándolos y mostrar después de un posterior cálculo en mi aplicación.
¿Afecta en algo engordar el ejecutable, se vuelve lento, no pasa nada? ¿Cual sería el mejor planteamiento?

Gracias espero vuestro sugerencias

jam
05-07-2006, 15:13:32
También puedes guardarlos en varias dll agrupadas por temas de forma que solo se utilice alguna de ella en función de la parte del programa que se este manejando.

Neftali [Germán.Estévez]
05-07-2006, 17:22:35
Mi duda es la siguiente, ¿Cuan bueno o No beneficioso es engordar una aplicación (ejecutable) de Delphi?, Todos sabemos, que por evitar ser pirateados algunos íconos, Imágenes, o Sonidos lo trabajamos con arcvhivos RES verdad?

Bueno, hoy en día no creo que sea esa la razón; Hay muchos que permiten extraer sin problemas esos recursos del ejecutable.
Creo que es más por ecitar errores y por facilidad.
Con un sólo ejecutable lo tienes todo; de la otra forma deberías copiar el ejecutable y los directorios; Si alguien se olvida del directorio ==> Error; Si alguien borrar sin querer algo del directorio ==> Error,...

¿Cuan beneficioso sería introducir en un RES 200 íconos 32x32?
¿Cuan beneficioso sería introducir en un RES 200 imágenes BMP 64x64?
Y como adimento digamos unas 5 imágenes BMP grandes (800x600) para fondos y otros.

Si lo piensas bien, al ponerlos en un directorio el EXE ocupa menos, pero el espoacio que ganas lo usas en el directorio, y no lo evitas, porque si tienes que copiar el programa, también tienes que copiar el directorio.
Sólo lo veo adecuado en caso de que realmente el ejecutable creciera mucho en tamaño. En ese caso un sólo archivo puede ser incómodo.

Deiv
06-07-2006, 01:18:19
¿Como???? esta parte si que no me la sabía........ ¿Como guardo en dll? ¿los íconos? ¿las imágenes?

Eso, ¿Como guardo en dll?

Por ahí leí (no recuerdo donde) que existen programas que leen íconos de dlls ¿es cierto eso? Entonces no tendría sentido, porque igual estarían desprotegidos.

Casi llegue a entender lo de Neftali (casi), según su post, entonces necesariamente debo dejarlo en un directorio imagenes e íconos??. Mi aplicación trabajará desde CD o en su defecto crearé un Instalador con (InoSetup, InstallShield, etc, para evitar el descuido de directorios)
¿dlls sería el mejor planteamiento? como?
¿Como encararían Uds. esta situación? ¿Que otras sugerencias?

Neftali [Germán.Estévez]
06-07-2006, 12:42:58
Casi llegue a entender lo de Neftali (casi), según su post, entonces necesariamente debo dejarlo en un directorio imagenes e íconos??

No creo haber dicho tal cosa. :confused::confused:
Depende del caso concreto.

Para iconos e imágenes normales yo siempre opto por ponerlos en recursos.
El tema del directorio es para casos especiales, pero no creo que se pueda generalizar.
* Por ejemplo si tu aplicación tiene 20 imágenes BMP para fondo de escritorio, no tendría sentido ponerlas como recursos; Mucho espacio. En ese caso la opción del directorio oparace más adecuada (pero debes preveer que alguien lo borre para que no pete la aplicación)
* Si tu aplicación usa 1 BMP de fondo, en ese caso tal vez sí valga la pena como recurso; Poco espacio.

Deiv
06-07-2006, 15:07:15
Perdon.... por eso mencioné "casi llegue a entender". Gracias por la aclaración

¿Pero como creo íconos dlls? y como los recupero desde Delphi? ¿se hace esto también con imágenes?
Eso es nuevo para mi.

Neftali [Germán.Estévez]
06-07-2006, 16:23:18
Basta con que crees un fichero de recursos como los estandard de Delphi y lo añadas a un proyecto de DLL.

Crea un archivo .RC como este (icons.rc):

BACK BITMAP ".\back.bmp"
BARCODE BITMAP ".\barcode.bmp"
...


Lo compilas usando el programa brcc32 (desde la linea de comandos)brcc32 icons.Rc > Errores.txt


Desde Delphi creas un nuevo proyacto en: File/New/Other/DLL Wizard

y donde pone {$R *.res} cambias eso por {$R ICONS.RES}
Compila, linka y la DLL resultante ya tiene los iconos.

Una vez que tengas la DLL creada, en mi caso, por ejemplo con el nombre: ResDLL.dll para recuperar los iconos haz lo siguiente:
(1) Crea una nueva aplicación de delphi.
(2) Coloca dos TImage y un botón.
(3) En el Onclick del botón coloca el siguiente código:


procedure TForm1.Button1Click(Sender: TObject);
var
DllHandle: THandle;
begin
// Cargar la DLL (debe estar en el mismo directorio)
DllHandle := LoadLibrary('.\ResDLL.dll');
// Cargada correctamente?
if DllHandle <> 0 then begin
// proteccion
try
//Cargar los recursos desde la DLL
Image1.Picture.Bitmap.Handle := LoadBitmap(DllHandle, 'BACK');
Image2.Picture.Bitmap.Handle := LoadBitmap(DllHandle, 'BARCODE');
finally
// Liberarla
FreeLibrary(DllHandle)
end;
end
else begin
// Error
ShowMessage(SysErrorMessage(GetLastError))
end;
end;


Una vez compilado si la DLL y el EXE están en el ismo directorio deberían funcionar.

Deiv
07-07-2006, 15:50:08
Neftali, muy didáctica tu explicación, seguí las instrucciones, he probado tu código y de maravilla!, Gracias. En un principio pensé que como existen muchos programas que trabajan con Iconos y recuperan formatos DLL (ArtIcons Pro, IconCool, etc) pensé que quedarían desprotegidos, intenté con un par de ellos abrir la DLL creada con Delphi (según tu ejemplo) y he observado que no los pueden abrir, ¿es así?. Estoy empezando a leer más sobre el Tema DLL, me parece que los Programas de Íconos recuperan otro tipo de dlls a los que se crea con Delphi....

Yo trabajo con Recursos para otros formatos de esta manera:

NuevoMP3 RCDATA MiMusica.mp3
NuevoWav WAVE MiWav.wav
NuevoAvi AVI MiAvi.avi
NuevoIco ICON Foto.ico
NuevoAni ANICURSOR Globos.ani
NuevoFont RCDATA FORTE.ttf

En las líneas:
DllHandle := LoadLibrary('.\ResDLL.dll');
if DllHandle <> 0 then begin
try
//Cargar los recursos desde la DLL
Image1.Picture.Bitmap.Handle := LoadBitmap(DllHandle, 'BACK');


¿Se realiza el mismo proceso para recuperar una DLL que tenga cargado un archivo ICO, ANI, WAV, MP3 y AVI?
Obviamente la última línea:
Image1.Picture.Bitmap.Handle := LoadBitmap(DllHandle, 'BACK');

tendrá que ser diferente para cada uno.

Imagino que la llamada a la DLL debe ser la misma para cualquier caso, pero....

¿Cual es la forma de cargar los Recursos desde la DLL para dichos casos? (ico, ani, wav, mp3, avi)

Neftali [Germán.Estévez]
07-07-2006, 17:55:28
...me parece que los Programas de Íconos recuperan otro tipo de dlls a los que se crea con Delphi...

Pues yo he probado con esa DLL dos de los que uso habituialmente (ResThief y ResHacker) y me recuperan los imágenes del interior perfectamente. :confused:

¿Se realiza el mismo proceso para recuperar una DLL que tenga cargado un archivo ICO, ANI, WAV, MP3 y AVI?


Obviamente no, cada tipo se debe recuperar de una forma distinta.

Seguro que buscando un poco por internet encuentras infomación para recuperar:
* Cursores (http://www.latiumsoftware.com/es/delphi/00021.php), Iconos y GIF (http://delphi.about.com/library/weekly/aa010405a.htm), WAV y MP3 (http://delphi.about.com/od/objectpascalide/l/aa021301c.htm), ...

Deiv
10-07-2006, 15:44:30
Tienes razón los Programas ResThief y ResHacker (que no los conocía) abren y leen normal las DLLs que contienen BitMaps. Entonces el camino que me quedaría para camuflarlos sería cambiar los nombres a mis DLLs? cosa que no sean muy llamativas, tal vez.

Me sugerieron también guardar en formato DAT, no se si es solo cambiar la extensión y ya.

Gracias por orientarme como sugerencia algunas páginas, me sirvió de mucho y voy a seguir investigando.

Ahora me compliqué más, encontré en algunas: DLL vs BPL.

seoane
10-07-2006, 15:47:45
Si se trata de proteger las imagenes porque no las encriptas, una encriptacion sencilla, lo suficiente para desanimar a un posible fisgon.

Deiv
10-07-2006, 16:05:31
Encriptar 200 imágenes? (tabla periódica) ¿Cada una?

Perdón por lo novato pero es así?

seoane
10-07-2006, 16:17:31
No es tan difícil encriptar una imagen, puedes hacer un programita que encripte las 200 en un par de segundos. Aprovechando un poco de código que tenia por ahí te dejo una función para encriptar Bmps, no es una maravilla criptográfica pero lo suficiente para desanimar a los curiosos.


type
Triple = array[1..3]of Byte;

procedure Cifrar(Imagen: TPicture; Clave: Longint);
var
Bitmap: TBitmap;
P: ^Triple;
i, j: Integer;
begin
RandSeed:= Clave;
if not (Imagen.Graphic is TBitmap) then
begin
Bitmap:= TBitmap.Create;
try
Bitmap.Width:= Imagen.Width;
Bitmap.Height:= Imagen.Height;
Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
Imagen.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;
Imagen.Bitmap.PixelFormat:= pf24bit;
for j:= 0 to Imagen.Bitmap.Height - 1 do
begin
P:= Imagen.Bitmap.ScanLine[j];
for i:= 0 to Imagen.Bitmap.Width - 1 do
begin
P^[1]:= P^[1] xor Byte(Random(256));
P^[2]:= P^[2] xor Byte(Random(256));;
P^[3]:= P^[3] xor Byte(Random(256));
inc(P);
end;
end;
end;


También te dejo el código en un zip listo para usar para que le eches un vistazo

Deiv
10-07-2006, 23:02:24
Gracias Seoane por la orientación, gracias a todos.
Intentaré más tarde probar la función y veremos como marcha.
Thanks!