Delphi - leer cadena del registro

 
Vista:

leer cadena del registro

Publicado por Loco (1 intervención) el 04/04/2003 22:25:52
necesito ayuda al leer una cadena del registro de windows.
lo estoy haciendo por medio de las funciones API de windows, pero me sale error de acceso a memoria y no se porque.

procedure ReadRegString(Key: HKEY; lpSubPath, lpSubKey, lpRetStr: PChar);
var
lpKey: HKEY;
lpLen: DWORD;
begin
RegOpenKey(Key, lpSubPath, lpKey);
RegQueryValueEx(lpKey, lpSubKey, nil, nil, nil, @lpLen);
GetMem(lpRetStr, lpLen);
RegQueryValueEx(lpKey, lpSubKey, nil, nil, @lpRetStr, @lpLen);
RegCloseKey(lpKey);
end;

y lo llamo de esta manera.
procedure Leer;
var
S: PChar;
begin
ReadRegString(HKEY_LOCAL_MACHINE, FExePath, FExeKey, S);
ShowMessage(String(S));
end;

tambien he probrado pasando el ultimo valor como string por referencia pero la misma historia.
alguna idea en como hacerlo bien, ya sea como funcion o procedimiento.
quiero hacerlo con API, no con el clase TRegistry.
gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:leer cadena del registro

Publicado por Domingo Seoane (65 intervenciones) el 05/04/2003 00:52:27
No me pare mucho para analizar el codigo pero a simple vista veo dos fallos, el primero es que el parametro lpRetStr no lo pasas como var asi que su valor no varia y el otro es que cuando usas ese mismo valor en la funcion RegQueryValueEx no lo haces de forma adecuada. Abajo te pongo el codigo con esas dos correcciones, lo he compilado y funciona bien. Pero puede que necesite algun otro retoque, como liberar la memoria que obtienes con getmen por ejemplo.

procedure ReadRegString(Key: HKEY; lpSubPath, lpSubKey:PChar; var lpRetStr: PChar);
var
lpKey: HKEY;
lpLen: DWORD;
begin
RegOpenKey(Key, lpSubPath, lpKey);
RegQueryValueEx(lpKey, lpSubKey, nil, nil, nil, @lpLen);
GetMem(lpRetStr, lpLen);
RegQueryValueEx(lpKey, lpSubKey, nil, nil, pbyte(lpRetStr), @lpLen);
RegCloseKey(lpKey);
end;

procedure Leer;
var
S: PChar;
begin
ReadRegString(HKEY_LOCAL_MACHINE, FExePath, FExeKey, S);
ShowMessage(String(S));
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer cadena del registro

Publicado por Loco (1 intervención) el 05/04/2003 04:32:14
gracias ya me funciono.
pero no logro entender porque funciona haciendo una "conversion" como PByte(lpRetStr) y no @lpRetStr.
porque en los lados se esta pasando una direccion en memory.
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer cadena del registro

Publicado por Ernesto D'Spirito (706 intervenciones) el 05/04/2003 10:38:23
lpRetStr es un puntero, más específicamente un puntero a Char (o sea, lpRetStr es un PChar). La función RegQueryValueEx espera como quinto parámetro un puntero a byte, o sea un PByte, por lo que se debe realizar explícitamente la conversión de tipos con la expresión PByte(lpRetStr), ya que si pasas lpRetStr sin convertir, el compilador generará un error de tipos incompatibles.

Sí, es cierto lpRetStr y PByte(lpRetStr) son punteros a memoria, y tienen el mismo valor, pero el compilador exige la conversión porque las conversiones explícitas son buena práctica de programación. Si te sirve saberlo, la conversión de punteros en realidad no hace absolutamente nada, es decir, no se generará nigún código ensamblador.

Ahora, no es lo mismo lpRetStr y @lpRetStr. Lo segundo sería la dirección del puntero (o sea, un puntero a un puntero).

Espero haber aclarado tus dudas.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar