Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
¿Dónde estoy? [averiguar el directorio de nuestra aplicación]

¿Ha necesitado alguna vez conocer en qué directorio se está ejecutando su aplicación? Es muy fácil averiguarlo, sobre todo si la aplicación es un fichero ejecutable. Se trata de un truco que se remonta a los tiempos del venerable Turbo Pascal: hay que preguntar por el parámetro cero de la línea de comandos.

Código Delphi [-]
function TForm1.DirectorioAplicacion: string;
begin
  Result := ExtractFilePath(ParamStr(0));
end;

Suponiendo que lo que realmente deseo es el directorio desde donde se ejecuta el fichero, he utilizado la función ExtractFilePath, que se encuentra en la unidad SysUtils. Esta función deja la última barra de directorio al final del resultado.

Claro, los tiempos cambian, y las técnicas mejoran. En una aplicación escrita en Delphi para la interfaz gráfica de Windows es preferible utilizar la propiedad ExeName del objeto global Application:

Código Delphi [-]
function TForm1.DirectorioAplicacion: string;
begin
  Result := ExtractFilePath(Application.ExeName);
end;

Ahora bien, ¿qué pasa si lo que estamos escribiendo es una DLL, y queremos saber en qué directorio la han instalado, para saber desde dónde se está ejecutando? Está claro que ya no vale utilizar la lista de parámetros, y que el objeto global Application ya no nos sirve. En una aplicación CGI/ISAPI para Internet, incluso, el objeto Application no tiene nada que ver con el tradicionalmente definido en la unidad Forms.

Por suerte existe una función del API de Windows, GetModuleFileName, que nos va a sacar las castañas del fuego. ¿Qué tal si primero muestro una versión incorrecta del código necesario?

Potencialmente incorrecta ...

Código Delphi [-]
function TForm1.DirectorioAplicacion: string;
var
  Buffer: array [0..255] of Char;
begin
  GetModuleFileName(0, Buffer, SizeOf(Buffer));
  Result := ExtractFilePath(StrPas(Buffer));
end;

Se trata de un error muy fácil de cometer, aunque difícil de detectar. ¿Se ha dado cuenta de que he pasado un cero en el primer parámetro de la función? Es que ese parámetro espera la instancia: un valor numérico que identifica unívocamente al programa...

...y ese es el problema. El valor cero corresponde al programa activo. Si estamos desarrollando un ejecutable, cero es perfectamente adecuado. Pero si la llamada se efectúa desde una DLL nuestra, ¡el directorio devuelto es el del ejecutable que llama a la DLL! Pero basta con utilizar la poco conocida variable global HInstance para que todo vuelva a la normalidad:

Versión correcta

Código Delphi [-]
function TForm1.DirectorioAplicacion: string;
var
  Buffer: array [0..255] of Char;
begin
  GetModuleFileName(HInstance, Buffer, SizeOf(Buffer));
  Result := ExtractFilePath(StrPas(Buffer));
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:07:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi