Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo puedo comprobar la existencia de un archivo al cargar mi programa? (https://www.clubdelphi.com/foros/showthread.php?t=6979)

darkone2k3 29-01-2004 13:52:17

Cómo puedo comprobar la existencia de un archivo al cargar mi programa?
 
Salu2 amigos foristas.

Mi pregunta es como puedo comprobar la existencia de un archivo, en este caso una dll que usa mi programa, antes de que se cargue mi programa.
Porque cuando ejecuto mi programa y no encuantra la dll, me aparace un mensaje de error y la aplicación se cierra.
Traté de comprobar la existencia del archivo en el OnCreate del formulario principal, pero no funciona, también lo traté de comprobar antes de inicializar la aplicación y me sigue dando error y realmente, no sé como puedo solucionarlo.

jac000y 29-01-2004 13:58:08

existe en delphi la funcion:

function FileExists(const FileName: string): Boolean;

darkone2k3 29-01-2004 14:12:01

Ya conozco la instrucción FileExists, la uso así en el OnCreate del formulario:
Código:

Var
  Directory: String;
Begin
  If Not FileExists( 'Funciones.dll' ) Then
  Begin
      Directory := ExtractFileDir( ParamStr( 0 ) );
      mxStorage1.ExtractTo( Directory );
  End;
End;

mxStorage1, es un componente en el cual almaceno la dll para extraerla cuando no exista.
Pero al ejecutar la aplicación me aparece el siguiente mensaje:
Cita:

Error al iniciar la aplicación porque no se encontró Funciones.dll. La reinstalación de la aplicación puede solucionar el problema.
Y realmente, no sé que puedo hacer para solucionarlo.

jac000y 29-01-2004 14:48:15

me parece que lo que esta fallando es ExtractFileDir,

no conozco bien como funciona, pero FileExists no te daria ese error

darkone2k3 29-01-2004 15:04:18

El problema no está en ExtractFileDir, porque cambié un poco el código para que me mostrara un mensaje si existe el archivo o no, y aún así me aparece el error de que no existe el archivo Funciones.dll, ni si quiera me muestra el mensaje "existe" o "no existe", que he puesto en los ShowMessage.

Código:

  If FileExists( ExtractFilePath( Application.ExeName ) + 'Funciones.dll' ) Then
      ShowMessage( 'existe' )
  Else
  Begin
      ShowMessage( 'no existe' );
      Directory := ExtractFileDir( ParamStr( 0 ) );
      mxStorage1.ExtractTo( Directory );
  End;


uhilari 29-01-2004 16:13:14

Hola

Me parece que el enlace a la Dll es el problema, si es un enlace estatico pues piensa en cargarlo mejor en forma dinamica, ya que si es un enlace estatico al inicializar la aplicación y antes de que se ejecute cualquier linea de codigo el mismo windows verifica la existencia del Dll y si no existe entonces bota ese error. Si cambias a la asignación dinamica no tendras ningun problema.

Suerte

darkone2k3 29-01-2004 16:22:19

Y cómo se hace eso?, porque yo la declaro de esta forma:
Código:

Function ValRut( Rut: String ): String; StdCall; External 'Funciones.dll' Name 'ValRut';
Me podrías explicar como se hace por favor.

Descendents 29-01-2004 17:59:13

Si yo por el error que dices yo creo que uhilari tiene razon.

Por ejemplo

ESTATICA
//declaracion
procedure DllMessage(s:string); external 'dll.dll'

//La llamas
procedure TForm1.Button1Click(Sender: TObject);
begin
DllMessage('hola');
end;

----------------------------------------------------

DINAMICA
//declaracion
type
GetFunc = procedure( Param: string ); register;

var GF : GetFunc;
H : Thandle;

//La llamas

procedure TForm1.Button1Click(Sender: TObject);
begin
h := LoadLibrary( 'dll.dll' );
If H <> NULL then begin
@GF := GetProcAddress( h, 'DllMessage' );
GF('hola');
FreeLibrary( h );
end;
end;

Saludos

darkone2k3 30-01-2004 01:00:06

Muchas gracias a todos los que me respondieron.

Tenías razón uhilari el problema se debía a que la carga de la dll era estática.
Me sirvió bastante tu código Descendents con ese código solucioné el problema.

Muchas gracias. :D

uhilari 30-01-2004 02:44:24

Hola de nuevo

Vaya Descendens me gano la publicación del codigo; pero para ser sinceros no me gusta la forma como lo hizo, me refiero a la utlización de las Variables globales GF y h yo prefiero variables locales o en todo caso un atributo de la clase TForm1; pero como dije antes el codigo funciona aunque les aconsejo en la medida de las posibilidades no usar las variables globales siempre traen problemas.

Suerte a Todos


La franja horaria es GMT +2. Ahora son las 19:39:47.

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