PDA

Ver la Versión Completa : Constantes, COMO modificar EXTERNAMENTE?


lag_0
25-12-2006, 17:32:26
Bueeeeeeeenas!
Pues más de una vez lo intenté pero nunca encontré nada y no consigo hacerlo :D, a ver si me dais una ayudita!

Lo que busco es:
Un .exe compilado, un programa funcional y tal, hay que definirle unos parametros que los defino como Constantes (me valdria variables public tmb o lo que sea), pues bien, la idea es modificar esas variables sin tener que recompilar el programa, desde otro programa hecho tambien en Delphi, vamos, un programa y su configurador, por que me interesa que todo se guarde dentro del .EXE.

Ideas de como hacerlo!?
Graciaaaaaaaaaas :p

DarKraZY
25-12-2006, 18:17:22
¿No te sirve un fichero ini o alguna base de datos?

marcoszorrilla
25-12-2006, 18:18:33
Supongo que lo quieres modificar es el contenido de las variables, porque si son constantes como su nombre indica no se podrán modificar.

Puede servir con un simple INI, en donde se guarden los valores que luego el programa recuperará al iniciarse y cargará en las variables correspondientes.

En este caso puedes crear un segundo EXE, que sea quien cree el INI y guarde los valores que nosotros le digamos.

Otra idea si se están manejando bases de datos en una Tabla, por ejemplo llamada configuración, guardar los valores con que se desee iniciar el programa, esto puede hacerse con un segundo EXE, o simplemente mediante las claves de Acceso al programa, por ejemplo solamente el administrador vería el menú con la opción de alterar estas variables.

Un Saludo.

lag_0
25-12-2006, 21:28:35
Si,
La idea es la de un INI, lo único que no quiero que tenga que llevar un INI, es decir, quiero la información modificable desde el segundo programa (siempre que el que quiero modificar no esté en ejecución) se guarde en el mismo exe para que no hayan más archivos que el .exe en cuestión.

A ver si a alguien se le ocurre como poder hacerlo...
De todos modos, gracias :)

Crandel
25-12-2006, 22:44:00
El archivo INI no es necesario llevarlo, xq al llevar el programa a otra maquina lo volves a crear.

La otra opcion es guardar en el registro de windows.

lag_0
25-12-2006, 23:38:22
ahy está la magia...
No quiero volver a crear el ini, quiero tener la facilidad de con un programa poder configurar un EXE y simplemente sin tener que compilar ese EXE de nuevo poder modificar valores de constantes o variables que ya serian predefinidas con un simple click...
De este modo enviando el EXE ya configurado no tendría que crear ningún archivo y ya tendria la configuración que yo desease sin necesidad de volver a compilarlo para modificar las constantes ni de ningun otro proceso...

Nosé si me acabo de explicar...

AzidRain
26-12-2006, 04:02:12
Mete los valores a modificar de manera externa como recursos incrustados dentro del EXE. Asi se pueden meter entre otras cosas: iconos, imagenes. Los valores me parece que tienen que ser string, pero se convierten y listo.

lag_0
26-12-2006, 12:13:54
Te refieres en el Description, copyrigth...?
Lo pensé y me imaginé que se podia modificar con facilidad las propiedades del fichero desde otro fichero... pero pensé que habria otro metodo :D

Crandel
26-12-2006, 12:31:52
No le des mas vueltas al asunto, lo que vos necesitas no son constantes, son variables de configuraci'on del programa.

Busca aca en el foro por TRegistry y TIniFile, vas a obtener miles de ejemplos de como se aplica.

Implementa un programa de prueba con cada uno y fijate cual te gusta mas.

lag_0
26-12-2006, 12:35:18
a ver...
Pero que eso ya lo sé hacer y lo sabemos todos!

Lo único que me interesa es poder guardar ciertos parametros de configuración en el mismo exe para mandarlo todo empaquetado y configurarlo simplemente con un par de clicks cosa que es muy gratificante cuando no has de recompilar el programa y no has de liarte a pasar zips a gente que no sabe ni lo que es winzip/rar/ace :D ni más de un file (claro está que cada uno necesitará una configuración diferente y no puede elegirla la maquina).

Crandel
26-12-2006, 12:56:37
pero la configuracion la tenes que hacer antes o despues de enviar el archivo? No te sirve mandar con valores por defecto para todos iguales?

lag_0
26-12-2006, 13:24:22
ahy está el tema, no me sirve mandarlo para todos iguales y no depende de ningun dato que pueda obtener de el sistema, por eso prefiero tener un configurador que no tener que compilar la aplicación por cada usuario...
Tampoco puedo hacer nada por defecto y que luego lo configure el usuario por que consiste en que no lo pueda cambiar... o al menos no de una manera simple... :p

Crandel
26-12-2006, 13:31:03
Perdon, era yo entonces el que no entendia, entonces lo que podrias hacer es como dice nuestro companiero AzidRain, incrustas el archivo de recursos dentro del EXE y luego haces un configurador que sea un editor de recursos

lag_0
26-12-2006, 13:44:30
sip va a ser la única salida :D..
Yo solo queria saber si habia algún modo de modificar las constantes externamente con el exe parado...
Imaginé que se podría :p.

Gracias a todos

Crandel
26-12-2006, 14:03:12
Al modificar los recursos del EXE, estas modificando el exe.

Tambien se puede modificar el EXE directamente, modificando sus valores, pero es mas complicado.

seoane
26-12-2006, 16:00:45
Vamos a poner un poco de código para aclara un poco el asunto. Como ya te dijeron la mejor opción es usar archivos de recursos. Lo primero es definir una estructura (un record) que contendrá los parámetros. Esta definición debe ser común a ambos programas, el que modifica y el que ha de ser modificado.

Por ejemplo:

TParametros = packed record
Parametro1: Integer;
Parametro2: Integer;
Parametro3: String[255]; // Si usas cadenas tienen que tener un tamaño conocido
end;


Ahora para leer los parámetros desde nuestra aplicación utilizaremos algo como esto:

var
Parametros: TParametros;
begin
// 1001 es el identificador, debe ser el mismo en ambos programas
if FindResource(GetModuleHandle(nil),MAKEINTRESOURCE(1001),RT_RCDATA) <> 0 then
with TResourceStream.CreateFromID(GetModuleHandle(nil),1001,RT_RCDATA) do
try
Read(Parametros,Sizeof(Parametros));
with Parametros do
ShowMessage(Format('P1=%d P2=%d P3=%s',[Parametro1,Parametro2,Parametro3]));
finally
Free;
end;
end;


Para actualizar los parámetros desde otra aplicación, haríamos algo como esto:

var
hExe: THandle;
Parametros: TParametros;
begin
Parametros.Parametro1:= 10;
Parametros.Parametro2:= 20;
Parametros.Parametro3:= 'Hola mundo';
hExe:= BeginUpdateResource(PChar(ExtractFilePath(ParamStr(0))+'Ejemplo35a.exe'),FALSE);
if hExe <> 0 then
begin
UpdateResource(hExe,RT_RCDATA,MAKEINTRESOURCE(1001),0,@Parametros,Sizeof(Parametros));
EndUpdateResource(hExe,FALSE);
end;
end;


Bueno, aquí te dejo el código, empaquetado y listo para usar. Primero compila el Ejemplo35a, y comprueba que no lee los parámetros. Ahora compila el Ejemplo35b y pulsa en "Actualizar parámetros", entonces ejecuta de nuevo el Ejemplo35a y veras que ahora ya lee los nuevos parámetros.

lag_0
26-12-2006, 19:49:01
seoane: muchisimas gracias, el ejemplo más claro imposible :p

Un saludo a todos =)

roman
26-12-2006, 21:58:37
¡Qué manera de complicarse la vida! ¿Qué tiene de más sencillo usar una segunda aplicación que modifique los recursos de otra que usar esa segunda aplicación para modificar unas entradas en el registro?

// Saludos

seoane
26-12-2006, 22:51:07
¡Qué manera de complicarse la vida! ¿Qué tiene de más sencillo usar una segunda aplicación que modifique los recursos de otra que usar esa segunda aplicación para modificar unas entradas en el registro?


Nadie dijo que fuese mas sencillo, seguramente es mucho mas complicado. Ya para empezar se necesitan 2 aplicaciones, mientras que usando el registro o archivos .ini, con una nos llegaría. Pero lo que yo creo, y eso solo lag_0 lo sabe, es que el quiere hacer una aplicación tipo "instalador", es decir, un solo exe que tu puedas llevar a cualquier equipo y se comporte como la has configurado. La única ventaja que tendría sobre el método de utilizar archivos .ini, es que solo habría que trasladar un archivo y no dos. Es la única ventaja que se me ocurre :confused:

roman
26-12-2006, 22:59:14
Ya, ya, es que ando medio burro :D La modificación de los parámetros se hace antes de la distribución y se quiere mandar sólo el exe modificado.

// Saludos

Crandel
26-12-2006, 23:24:04
Tiene varias posibles aplicaciones, como medida de seguridad podrias enviar tu ejecutable a tu cliente con el nombre de usuario o serial incluido en el propio ejecutable.

AzidRain
27-12-2006, 01:17:25
Si es para seguridad o poner datos de tu cliente o cosas "secretas", las puedes poner al final del archivo exe como datos binarios, pero tendras que meterte con un poco de teoria de bajo nivel y conocer siempre el punto exacto en donde se puede escribir sin problemas. Además si recompilas el punto que habias determinado ya no será el mismo y tendras que volverlo a calcular. Se puede hacer pero te repito, es meterse con teoria un poco olvidada.

AzidRain
27-12-2006, 01:17:29
Si es para seguridad o poner datos de tu cliente o cosas "secretas", las puedes poner al final del archivo exe como datos binarios, pero tendras que meterte con un poco de teoria de bajo nivel y conocer siempre el punto exacto en donde se puede escribir sin problemas. Además si recompilas el punto que habias determinado ya no será el mismo y tendras que volverlo a calcular. Se puede hacer pero te repito, es meterse con teoria un poco olvidada.

roman
28-12-2006, 06:23:01
No sé si es a lo que se refiere AzidRain, pero accidentalmente acabo de dar con el artículo Writing custom data to executable files in Windows and Linux (http://dn.codegear.com/article/27979) que explica al detalle cmo agregar datos al final del ejecutable y cómo leerlos.

// Saludos

Crandel
28-12-2006, 07:59:02
Excelente artículo Roman

seoane
28-12-2006, 12:21:12
Caramba roman, sabia que había visto una solución como esta por algún lado. Pensaba que había sido en este foro, pero no conseguía encontrarla. De todas formas, el sistema no es tan complicado. Simplemente añade la información al final del ejecutable. Lo mismo se podría hacer con imágenes, vídeos, o cualquier otro formato en el que su longitud esta especificada dentro del propio archivo. En cuanto a la forma de hacerlo, también es sencilla, una etiqueta para saber si se a añadido información o no, y un valor con el tamaño de la misma. Algo muy similar a las etiquetad ID3 de los archivos mp3.

De todas formas, esto me lleva a otra discusión que tuve hace tiempo. El método funciona, al igual que el de los recursos, pero la cuestión es cual debemos usar. Mientras utilizar recursos se ajusta a la estructura estándar del ejecutable, este otro aunque funciona, no lo hace. ¿Que opináis?

Crandel
28-12-2006, 14:46:12
El método funciona, al igual que el de los recursos, pero la cuestión es cual debemos usar. Mientras utilizar recursos se ajusta a la estructura estándar del ejecutable, este otro aunque funciona, no lo hace. ¿Que opináis?

De pende de lo que quieras hacer, si es guardar informacion confidencial en el cual solo deberias saber como se guarda y su estructura, entonces aniadimos informacion al final del ejecutable. Si te interesa o no te importa que pueda ser cambiada si alguien lo desea, la de los recursos.

seoane
28-12-2006, 15:10:34
De pende de lo que quieras hacer, si es guardar informacion confidencial en el cual solo deberias saber como se guarda y su estructura, entonces aniadimos informacion al final del ejecutable. Si te interesa o no te importa que pueda ser cambiada si alguien lo desea, la de los recursos.

Es interesante lo que tu dices, porque yo creo que a veces confundimos seguridad con oscuridad. Me explico, si basamos la seguridad en utilizar un método que solo nosotros conocemos, es inevitable que tarde o temprano alguien averigüe que método utilizamos y quedaremos expuestos completamente. Si es "oscuridad" lo que buscamos, obtendríamos algo similar encriptando los datos (con un simple XOR) antes de guardarlos como un recurso.

En resumen, cifrar los recursos o usar el método que menciona roman, solo se lo pondrían un poco mas difícil a un posible atacante. Entonces, me vuelvo a preguntar, ¿merece la pena romper el estándar?

Aunque ahora que releo el articulo de roman, de hecho solo con leer el titulo, me hace pensar que el motivo de usar este método tan original es el poder usar el mismo código en una aplicación windows y linux sin tener que hacer ninguna modificación. Tengo que prestar mas atención cuando leo :p

Casimiro Notevi
28-12-2006, 15:27:07
Ese sistema de escribir "cosas" al final del ejecutable lo estuve usando durante años desde la época del MSDOS y jamás me dio ningún problema.
Lo usaba para guardar información de control: fecha de instalación, veces ejecutado, etc.

Crandel
28-12-2006, 15:30:31
El hecho de ocultarlo no excluye el cifrado, son opciones extras de seguridad.

Por otro lado los estandares se definen para que varias personas de manera diferente o no, simplemente conociendo el la deficinicion, puedan obtener el mismo resultado.

Si lo que haces es guardar informacion personal, para que te interesa el estandar?

De nuevo, todo depende de la aplicacion.

Ing_Fajardo
03-01-2007, 00:09:36
y no funciona hacer un atajo o "short-cut" del archivo EXE y en ese archivo usar PARAMETROS ( de linea de comandos ) y asi al cliente solo le envias el archivo de atajo y listo ?

Asi no modificas el EXE....

lag_0
03-01-2007, 03:28:19
demasiado chapuzas esa solución :D

Me funciona a mil maravillas la de seoane,+10 para el :cool: .