FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
existe en delphi la funcion:
function FileExists(const FileName: string): Boolean; |
#3
|
|||
|
|||
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; Pero al ejecutar la aplicación me aparece el siguiente mensaje: Cita:
|
#4
|
|||
|
|||
me parece que lo que esta fallando es ExtractFileDir,
no conozco bien como funciona, pero FileExists no te daria ese error |
#5
|
|||
|
|||
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; |
#6
|
|||
|
|||
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 |
#7
|
|||
|
|||
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'; |
#8
|
|||
|
|||
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). |
#9
|
|||
|
|||
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. |
#10
|
|||
|
|||
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 |
|
|
|