PDA

Ver la Versión Completa : Problemas al escribir el registro de windows


pablopessoa
16-02-2009, 19:35:50
Hola gente forista!!
Bueno les comento el problema que tengo.
Estoy haciendo una aplicacion que tendra una licencia y un sistema de logueo, entonces quiero guardar ( en la instalacion) los datos necesarios para hacer esto. El problema es que no quiero guardarlos como "reg.WriteString" por que de esta manera si entras en el registro de windows podes leerlas y yo no quiero eso. Entonces pense en poner todo dentro de un registro (ejemplo a continuacion) y guardar el registro como Binary y despues recuperar el registro con los datos. Yo hago este codigo para guardar los datos :

var
reg2:TRegistry;
opcion:TOpciones;
begin
reg2:= TRegistry.Create;
reg2.CreateKey(clave);
reg2.OpenKey(clave,true);
opcion.telefono:= Etelefono.Text;
opcion.nombre:= Enombre.Text;
opcion.direccion:= Edireccion.Text;
opcion.ciudad:= Eciudad.Text;
opcion.password:= Epassword.Text;
opcion.limiteprueba:= '5';
opcion.codigo:= 'temp';
reg2.WriteBinaryData('datos',opcion, SizeOf(opcion));


El problema es que cuando hago :


temp:=reg.ReadBinaryData('datos',opciones, SizeOf(opciones));


esto me retorna un entero y no el registro Topciones.
Podrian ayudarme a corregir esto? Como podria guardar los datos encriptados ( como binary) y recuperarlos bien para que no sea tan facil modificarlos??
Muchas gracias por tomarse el tiempo de leer mi post.
Un saludo a todos!!

pablopessoa
17-02-2009, 01:27:42
Bueno capas es algo muy complicado o imposible de realizar lo que quiero, por lo tanto me conformo con que me ayuden a guardar los datos en el registro con las siguientes preferencias :

1- que no se guarden con "WriteString" por que de este modos serian visibles entrando con RegEdit.
2- si se pueden agrupar antes de guardarlos, para guardarlos como una unica clave en el registro que luego pueda recuperar y asi rearmar los datos, mejor que mejor

Saludos!

roman
17-02-2009, 01:30:54
Pues no entiendo. En principio al usar:


reg.ReadBinaryData('datos',opciones, SizeOf(opciones));


los datos estarán en la variable Opciones. O sea, que ya lo tienes.

// Saludos

pablopessoa
17-02-2009, 01:41:54
claro claro, yo pense lo mismo , pero mira lo que dice delphi de la implementacion del ReadBinaryData :


function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
var
RegData: TRegDataType;
Info: TRegDataInfo;
begin
if GetDataInfo(Name, Info) then
begin
Result := Info.DataSize;
RegData := Info.RegData;
if ((RegData = rdBinary) or (RegData = rdUnknown)) and (Result <= BufSize) then
GetData(Name, @Buffer, Result, RegData)
else ReadError(Name);
end else
Result := 0;
end;


es una funcion que me retorna el largo de los datos en un entero, osea , en mi codigo, en la variable temp me queda un numero entero, y no el registro Topciones qeu guarde con toda la informacion.
O la otra posibilidad es que yo este entendiendo mal y que el registro qeude guardado en el parametro que le pase (en este caso "opciones") y que el valor numero que me retorna sea solo a modo informativo.. puede ser?

roman
17-02-2009, 01:51:19
O la otra posibilidad es que yo este entendiendo mal y que el registro qeude guardado en el parametro que le pase (en este caso "opciones") y que el valor numero que me retorna sea solo a modo informativo.. puede ser?

¡Pues es lo que te digo! Y lo que dice la ayuda de Delphi:


Delphi syntax:

function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer): Integer;

If successful, ReadBinaryData writes the requested data into Buffer and returns the number of bytes written.


Es decir, regresa el número de bytes escritos (normalmente lo mismo que indicas en el parámetro BufSize), y los datos son escritos en Buffer, que corresponde a tu variable Opciones.

// Saludos

pablopessoa
17-02-2009, 02:11:48
disculpa que te colme la paciencia, de verdad que no es mi intencion ser bruto, pero hay algo que no anda.
estoy siguiento paso a paso el programa y cuando grabo los datos en el registro los graba bien, es decir, graba el registro "opcion" con esta forma : ("sdfsd", "asdfaf", etc), el problema esta cuando recupero. Cuando ejecuto esta linea :

reg.ReadBinaryData('datos',opciones, SizeOf(opciones));

el debug(en la parte inferior izquierda que va mostrando los
valores que toman las variables) dice "opciones inaccessible value"
y probe de hacer un showmessage(opciones.nombre) para ver que me mostraba y me saca el cartelito vacio
perdona que te moleste asi, pero a mi me pone mas nervioso que a vos no poder resolver algo por no saber como ....:(

roman
17-02-2009, 02:21:49
Bueno, yo nunca he usado esos métodos, nada más me estoy basando en lo que dice la ayuda.

Ahora bien, se me ocurre preguntar: ¿cómo está definido TOpciones? Porque veo que tienes varios campos de texto, y no sé si los estás definiendo simplemente como string o bien como alguno de los tipos de longitud fija como string[84].

Si sólo pones string no te va a funcionar porque en ese caso, el campo es -en el fondo- sólo un apuntador a la cadena y al usar WriteString supongo que se escribirá sólo una cadena vacía. Debes usar cadenas de longitud fija.

// Saludos

pablopessoa
17-02-2009, 02:26:07
bueno ahora tengo una punta para probar, efectivamente TOpciones esta definido asi :

TOpciones = record
telefono: String;
nombre: String;
direccion: String;
ciudad: String;
codigo:string;
password: String;
limiteprueba: string;
end;


dejame probar con cadenas de longitud fija y te comento que pasa
Muchas gracias por la paciencia !!:)

pablopessoa
17-02-2009, 02:35:13
bueno dejame contarte con total felicidad y mi mas grato agradecimiento que efectivamente ese era el problema!!
cambie los string por string [100] y anda muy bien!!!
Muchisimas gracias!! ahora puedo guardar toda la informacion de la instalacion en el registro de windows de una manera que sea bastante dificil poder manipular los datos
Nuevamente muchas gracias!! :):):)