Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-01-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
Exclamation 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.
Responder Con Cita
  #2  
Antiguo 29-01-2004
jac000y jac000y is offline
No confirmado
 
Registrado: may 2003
Posts: 14
Poder: 0
jac000y Va por buen camino
existe en delphi la funcion:

function FileExists(const FileName: string): Boolean;
Responder Con Cita
  #3  
Antiguo 29-01-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 29-01-2004
jac000y jac000y is offline
No confirmado
 
Registrado: may 2003
Posts: 14
Poder: 0
jac000y Va por buen camino
me parece que lo que esta fallando es ExtractFileDir,

no conozco bien como funciona, pero FileExists no te daria ese error
Responder Con Cita
  #5  
Antiguo 29-01-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 29-01-2004
uhilari uhilari is offline
Miembro
 
Registrado: ene 2004
Posts: 21
Poder: 0
uhilari Va por buen camino
Talking

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
Responder Con Cita
  #7  
Antiguo 29-01-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 29-01-2004
Descendents Descendents is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 396
Poder: 21
Descendents Va por buen camino
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
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón).
Responder Con Cita
  #9  
Antiguo 30-01-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 30-01-2004
uhilari uhilari is offline
Miembro
 
Registrado: ene 2004
Posts: 21
Poder: 0
uhilari Va por buen camino
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
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 19:49:50.


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