Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como evito error cuando no esta una Dll?? (https://www.clubdelphi.com/foros/showthread.php?t=27891)

marceloalegre 02-12-2005 16:44:25

Como evito error cuando no esta una Dll??
 
Buenos Dias:
Les consulto a ver si existe una solucion a este tema... tengo un programa en el cual invoco una dll. de la siguiente manera
Código Delphi [-]
function Ejecutaaccion ; external 'MIDLL.DLL' index 1;

Imaginemos que la dll se borro por "arte de magia" ... entonces cuando ejecuto el programa me dice
No se encuentra la biblioteca de vinculos dinamicos.. blablabla...
O sea me dice que falta la dll... el tema es asi... no hay manera de que cuando pasa esto se pueda generar una excepcion o algo... quiero que el programa funcione ...

Ademas.. en mi ejecutable tengo la dll dispuesta a copiarse al directorio, pero evidentemente primero busca las dll's antes de hacer cualquier cosa...

No se que puedo hacer para que me deje copiarla (eso esta resuelto) ,, o sea que las invocaciones se hagan mas tarde..
emmm espero que me entiendan...

Gracias!!!

ElKurgan 02-12-2005 17:58:09

La culpa la tiene el enlace estatico en el ejecutable: Intenta cargar el enlace a la DLL antes de que empiece ninguna linea de codigo. La solucion pasa por llamar a las dll mediante enlaces dinamicos, aunque esto tiene el inconveniente de que si tienes muchas llamadas a la funcion tendrias que modificar mucho codigo.

Aunque tambien puedes solucionarlo lanzando un pequeño programa cargador antes de que se ejecute el tuyo propio, que intente copiar la dll y si no puede es que existe o esta en ejecucion en memoria.

Un saludo

marceloalegre 02-12-2005 20:31:02

estuve mirando el tema, siempre cargue las dll estaticamente...

estuve mirando el comando loadlibrary y cambie la declaracion.. pero no me anda... alguien puede postear un ejemplo claro de carga dinamica? porque llamo la dll es un procedure y no me da ni la hora... o sea no funciona...

dec 03-12-2005 04:26:51

Hola,

Esto podría ser al menos una forma de llamar a una función situada en una librería realizando la carga de estas dinámicamente, como dicen que se dice. Es muy posible que no sea la única forma de hacerlo. Se trata, en este caso, de cargar la función "ShowCursor" que se encuentra en la librería "user32.dll".

Código Delphi [-]
procedure MostrarCursor(mostrar: boolean);
type
  TShowCursorProc = function(bShow: BOOL) : HResult; stdcall;
var
  HandleDll: THandle;
  FuncionDll: TShowCursorProc;
begin
  HandleDll := LoadLibrary('user32.dll');
  if (HandleDll <> 0) then // Se cargó la librería
  begin
    @FuncionDll := GetProcAddress(HandleDll, 'ShowCursor');
    if (@FuncionDll <> nil) then // Tenemos la función
    begin
      FuncionDll(mostrar); // Podemos utilizarla, pues
    end;
    FreeLibrary(HandleDll);
  end;
end;
Alguna vez he enlazado aquí a cierto artículo de Néstor Freire titulado "Cómo crear y utilizar las librerías en nuestros programas". ;)

De todas formas Víctor, se me ocurre que hagas lo que te han sugerido, que me parece que podría funcionar, si es que no hay algún inconveniente en hacer algo como lo siguiente: que lo primero de todo en tu programa sea extraer la "DLL" que lleva incorporada y copiarla donde sea menester... ¿o es que se me escapa algo? ;)

fide 01-03-2008 18:09:48

Increible
 
Cita:

Empezado por dec (Mensaje 119562)
Código Delphi [-]procedure MostrarCursor(mostrar: boolean);
type TShowCursorProc = function(bShow: BOOL) : HResult; stdcall;
var HandleDll: THandle; FuncionDll: TShowCursorProc; begin HandleDll := LoadLibrary('user32.dll');
if (HandleDll <> 0) then // Se cargó la librería
begin @FuncionDll := GetProcAddress(HandleDll, 'ShowCursor');
if (@FuncionDll <> nil) then // Tenemos la función
begin FuncionDll(mostrar); // Podemos utilizarla, pues
end;
FreeLibrary(HandleDll);
end;
end;

Ciertamente este codigo esta marabilloso. A mi me ha venido como cantaro a la fuente para hacer las cosas que necesito con dll. Jaaaa!


La franja horaria es GMT +2. Ahora son las 03:29:57.

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