Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-08-2005
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Caso con DLL.

Tengo una DLL e hice la prueba de eliminarla para ver si mi programa iniciaba. El resultado es que el programa se cierra luego de mostrar este mensaje:

Cita:
Error al iniciar la aplicación porque no se encontró xxxxx.dll. La reinstalación de la aplicación puede solucionar el problema.
Esto quiere decir que si un usuario elimina por error esta librería no podrá volver a iniciar el programa.

Lo que deseo es saber si hay forma de que el programa se pueda ejecutar aunque la librería no esté presente, ya que no es estrictamente necesaria para el funcionamiento del programa.

Gracias.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #2  
Antiguo 18-08-2005
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
Hola,

Hay una contradicción en lo que dices, porque, si la librería no es estrictamente necesaria para el programa, ¿cómo es que el programa no puede trabajar sin esa librería?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 18-08-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
Si te da ese error es que el programa, lógicamente, está haciendo uso de alguna función que se encuentra implementada en la .dll, por lo que es imposible ejecutarlo si dicha .dll no está.

(La única solución que veo, si tienes el código fuente, es modificar el programa para que no use esa .dll)

Chao!
Responder Con Cita
  #4  
Antiguo 18-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hasta donde entiendo tendrás que cargar manualmente la librería con LoadLibrary y asignar las funciones contenidas en ellas con GetProcAddress. Deberás quitar cualquier referencia a la librería que tengas en tu código para que no se cargue automáticamente. Por ejemplo, cualquier importación

Código Delphi [-]
procedure blablabla; external 'libreria.dll';

hará que se cargue en automático.

// Saludos
Responder Con Cita
  #5  
Antiguo 18-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Hay una contradicción en lo que dices, porque, si la librería no es estrictamente necesaria para el programa, ¿cómo es que el programa no puede trabajar sin esa librería?
El programa no puede trabajar de entrada porque la librería se carga en automático y al no estar presente falla la entrada al programa.

Pero esto no significa que siempre sea necesaria. Es posible que sólo algún módulo del programa utilice la librería. Mientras no se use dicho módulo el programa puede funcionar.

De ahí, supongo, la necesidad de poder ejecutar la aplicación aún sin la librería. Sólo los módulos que la usen estarían inhabilitados.

// Saludos
Responder Con Cita
  #6  
Antiguo 18-08-2005
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
Hola,

Puede ser roman. No lo vi yo por ese lado, sino por otro. El programa hace uso de la librería, depende de esta, en más o menos, en un módulo u otro, por tanto, si se quita la librería el programa (al completo) no funcionará correctamente. Ahora, si se trata de que algunos módulos funcionen y otros no... ¿no habrá otra forma de hacer las cosas que no quitando y poniendo la librería de marras?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 18-08-2005
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
roman tiene razón. Lo que él dice es exactamente lo que sucede. La librería se usa sólo desde una ventana de mi aplicación, y no es crítica para el funcionamiento del sistema. Aunque claro, si no está algo no funcionará, pero es muy poco en realidad.

Muchas gracias por su respuesta. Voy a trabajar con LoadLibrary y GetProcAddress.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #8  
Antiguo 18-08-2005
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
Hola,

Cita:
Empezado por mlara
roman tiene razón.
No solamente tiene razón, si tú lo dices, pero además ciertas dotes de adivino, dicho sin ánimo de ofender, naturalmente.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 18-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
pero además ciertas dotes de adivino
No realmente.

Si alguien me dice: le quite la rueda a mi auto para ver si funcionaba sin ella, supongo de antemano que se está refiriendo a la rueda de refacción.

// Saludos
Responder Con Cita
  #10  
Antiguo 18-08-2005
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
Hola,

Vale. Quito adivino. Pero, si la rueda de refacción es la rueda de repuesto y a mí alguien me dice "le quité la rueda a mi auto para ver si funcionaba bien", sin decirme que la rueda en cuestión es la rueda de repuesto,... pues acaso le diga que cómo se le ocurre hacer el loco con su coche de esa manera, que con tres ruedas lo menos es que se la pege. No corras, papá.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-08-2005 a las 23:03:26. Razón: (corrección del texto)
Responder Con Cita
  #11  
Antiguo 18-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
mlara:

Te pongo un ejemplo que he visto de cómo cargar en tiempo de ejecución la librería y sus funciones.

Código Delphi [-]
var
  // identificador de la librería
  lib_handle: HMODULE;

  // declaras el encabezado de cada función como variable
  mysql_connect: function(_mysql: PMYSQL; const host, user, passwd: pChar): PMYSQL; stdcall;

function loadlib: boolean;
  procedure assign_proc(var proc: FARPROC; name: pChar);
  begin
    proc := GetProcAddress(libmysql_handle, name);
    if proc = nil then libmysql_status := LIBMYSQL_INCOMPATIBLE;
  end;

begin
  lib_handle := LoadLibrary('libmysql.dll');

  if lib_handle = 0 then
    Result := false
  else
  begin
    assign_proc(@mysql_connect, 'mysql_connect');

    { otras asignaciones }

    Result := true;
  end;
end;

loadlib carga la librería y asigna a la variable mysql_connect (que es de tipo funcion) la dirección de la función en el dll. El procedmineto local assign_proc es para facilitar la asignación en caso de que haya muchas funciones. Si la librería no se encuentra, loadlib regresa false.

Si ya no necesitas la librería, puedes descargarla con

Código Delphi [-]
FreeLibrary(lib_handle);

// Saludos
Responder Con Cita
  #12  
Antiguo 19-08-2005
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Gracias roman. Reescribí un poquitín el código y funcionó bien. Ahora sólo ejecuta las funciones de la DLL cuando esta está disponible, y si no lo está, igual la aplicación corre.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #13  
Antiguo 19-08-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Cita:
Empezado por roman
...Si alguien me dice: le quite la rueda a mi auto para ver si funcionaba sin ella, supongo de antemano que se está refiriendo a la rueda de refacción...
A menos que el dueño del auto sea un informático (un pequeño chascarrillo ).

Aprovecho la ocasión para invitarlos a cambiar el uso de "librería" por biblioteca, el cual es el término correcto.

Un abrazo profesional.

Al González.

Última edición por Al González fecha: 19-08-2005 a las 04:55:40.
Responder Con Cita
Respuesta



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 18:33:17.


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