PDA

Ver la Versión Completa : algunas dudar sobre funcion para obtener directorio


javier20
20-06-2007, 22:06:21
buenass, tengo algunas dudas hace tiempo que vengo conel delphi, a ver si alguien me las puede resolver se lo agradeceria muchisimo:

aca van:.............


Código Delphi [-] (http://www.clubdelphi.com/foros/#)function WinDir: string;
var
Path: array[0..MAX_PATH - 1] of Char;
begin
GetWindowsDirectory(Path, Sizeof(Path));
Result := string(Path) + '\';
end;




bueno en primer lugar andube haciendo pruebas, con un ShowMessage(IntToStr(MAX_PATH)) y me da que el contenido de esa variable es de 260 caracteres, hasta ahi todo ok.

1-parece ser que tratandose de rutas del systema siempre es mas conveniente usar un array de chars en lugar de una string, me gustaria saber por q

2- veo que a esa variable MAX_PATH le resta -1, sabiendo que el array comienza en el caracter 0 y que llega hasta 260 yo estaria teniendo 261 aracteres, y restandole el -1 obtendria 260 de nuevo , por que no poner un numero mas simple como 200 y listo:D ?

3- GetWindowsDirectory(Path, Sizeof(Path)); aca parece ser que pone en el array(Path) el contenido de el directorio windows, y el segundo parametro rellena el contenido con un determinado numero de bits, para que?

4- Result := string(Path) + '\'; el Result es el equivalente a lo que va a devolver la funcion, cierto? osea una string, pero ahi veo que pasa el array a string y le suma el caracter quedando la ruta asi : C:\WINDOWS\ pero si no le paso la palabra string sigue funcionando = :confused:

bueno por ahora son esas dudas nomas y me quedan un monton:D bueno si alguien me puede ayudar se lo agradeceria muchisimo,desde ya muchas gracias.

roman
20-06-2007, 22:41:14
1. Internamente, un string es un apuntador, y como la función es de la API de Windows y no de Delphi, éste no sabría que cantidad de memoria asignarle. Supongo que podrías usar un string pero especificando antes una longitud:


SetLength(Path, 260);


2. El porqué específico del 260 tendrás que preguntárselo a Bill Gates.

3. Ese parámetro indica a la API de Windows de qué tamaño es el buffer donde va a colocar el resultado. Si el tamaño es menor que lo que ocupa el path, windows te devolverá el número de bytes que debe tener tu buffer. Si somos muy exquisitos, deberíamos programar así:


var
Path: PChar;
Length: Integer;

begin
Length := GetWindowsDirectory(Path, 0);
GetMem(Path, Length);

try
GetWindowsDirectory(Path, Legth);
finally
FreeMem(Path);
end;
end;


para así usar sólo la memoria indispensable.

4. El que programó ese ejemplo olvidó que un array[0..N] of Char es compatible con string.

// Saludos