Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Caso con DLL. (https://www.clubdelphi.com/foros/showthread.php?t=24399)

mlara 18-08-2005 21:19:29

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.

dec 18-08-2005 21:26:50

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?

jmariano 18-08-2005 21:27:32

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!

roman 18-08-2005 21:30:28

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

roman 18-08-2005 21:34:22

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

dec 18-08-2005 21:47:26

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?

mlara 18-08-2005 22:05:56

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.

dec 18-08-2005 22:50:53

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.

roman 18-08-2005 22:57:58

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

dec 18-08-2005 23:02:28

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á.

roman 18-08-2005 23:13:19

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

mlara 19-08-2005 04:02:06

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.

Al González 19-08-2005 04:48:20

¡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 :D :D (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. :)


La franja horaria es GMT +2. Ahora son las 23:44:27.

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