Ver Mensaje Individual
  #14  
Antiguo 01-03-2017
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Bueno, pues, a ver si soy capaz de explicarme, pero, vaya por delante que al final parece que lo he/mos conseguido. Esta mañana quise probar lo que Mario y bitbow propusieron. Pues bien, el caso es que los resultados obtenidos no eran los esperados, esto es, la cosa funcionaba bien para determinados iconos, pero, no para otros. Ya había escrito aquí un mensaje describiendo esta situación, cuando, después de enviarlo (algunos lo habréis acaso recibido) he decidido borrarlo, puesto que algo no me cuadraba...

En primer lugar he querido descubrir que la suma TAMAÑO EJECUTABLE + TAMAÑO ICONO, no coincidía con lo que obteníamos al medir el tamaño del ejecutable, una vez cambiado el icono. Yo esto lo he atribuido al hecho de que el icono se guarde en un determinado recurso del ejecutable: tal vez, entonces, el tamaño del icono no sea exactamente igual al tamaño final que tenga el recurso que alberga el icono. No estoy seguro de este párrafo en concreto, pero, el caso es que he borrado mi mensaje, y es que...

¿Por qué funcionaba con unos iconos pero no con otros? Y entonces he descubierto que el icono problemático, tenía en su interior varios tamaños de imagen, partiendo de un tamaño de 512 píxeles. He intentado abrir entonces el archivo ejecutable generado con el programa XN Resource Editor, y, en efecto, no he podido acceder al recurso "MAINICON", por un error "Pixel Format Not Valid for Icons or Cursors".

Entonces he considerado que, aunque podía cambiarse dicho icono sin errores, tal vez dicho icono estaba jorobándolo todo, porque, de hecho el icono original del ejecutable tiene un tamaño máximo de 256 píxeles, y, si no me equivoco, Delphi XE2 no soporta (en Windows) iconos de más resolución que esa. De modo que ahora parecía que el problema no venía dado porque el TAMAÑO EJECUTABLE + TAMAÑO ICONO no coincidiese con el tamaño del ejecutable generado.

El problema parecía causarlo el icono de tamaño de 512 píxeles, y, en efecto, al quitar la imagen de dicho tamaño del icono, o usando iconos de un tamaño máximo (no parece importar el mínimo) de 256 píxeles, la cosa parece funcionar como se espera... y ahora puedo obtener ejecutables "que funcionan" mayores de 1,5 GB. O sea, ¿prueba superada? Parece que sí, pero, me quedan algunas dudas al respecto y son las siguientes:

1º Sigo pensando que, en efecto, el TAMAÑO EJECUTABLE + TAMAÑO ICONO no coincide con el tamaño que al cabo el ejecutable tiene. Resulta que cuando se cambia el icono de un ejecutable, no se trata de sumar al tamaño del ejecutable el tamaño del archivo del icono, sino que este último se alberga en un recurso del ejecutable que, digamos, tiene su propio tamaño. Luego lo que yo estoy guardando ahora mismo, es decir, TAMAÑO EJECUTABLE + TAMAÑO ICONO, parece funcionar, sí, pero, aunque sin estar seguro, me atrevo a decir que funciona porque la descompresión del archivo tiene cierta "tolerancia", de modo que no importa si el "stream" que se lee es mayor que el original: la descompresión se realiza sin problemas.

2º Creo que la función "GetExeSize" debería seguir funcionando en Windows NT (no diré ya en Windows 64 bits, porque, aunque funcionase, tal vez el código tampoco tendría nada que ver). Si esta función hiciese su trabajo como lo hacía en los tiempos de Windows 9x, seguramente todo sería más sencillo, mejor dicho, más exacto, puesto que estaríamos obteniendo el tamaño del ejecutable original ya con el icono incluido... y teniendo en cuenta que el tamaño de este puede no tener que ver con el tamaño que ocupe el icono en el recurso correspondiente.

3º Tengo que tomar el camino del primer punto. Una vez descubierto que el causante del problema era un determinado icono (de tamaño excesivo) he querido probar con "GetExeSize", pero, no funciona. Es decir, de momento, tengo que tomar el camino sugerido por Mario y bitbow, puesto que, aunque no sea "exacto" (vamos, si no es que estoy completamente equivocado) parece funcionar correctamente, siempre que el icono no supere el tamaño máximo, pero, esto ya no es problema de la solución, sino de que iconos de más tamaño no parecen soportarse.

En fin, voy a hacer unas cuantas pruebas más, pero, como digo, parece que el asunto se puede dar por solucionado... al menos mi proyecto puedo ahora "compilar" aplicaciones de más de 500 MB, y, además hacerlo de una forma más rápida y segura en todo caso, puesto que antes actualizaba un recurso del ejecutable "base", y, esto causaba problemas no sólo con archivos grandes, a veces también con los pequeños. Esta otra opción de "adjuntar" al ejecutable un archivo es más rápida y eficiente.

¡Muchas gracias a todos! ¡Comentaré por aquí cómo acaba la cosa!
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 01-03-2017 a las 14:52:15.
Responder Con Cita