Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-12-2006
ALfrediKruger ALfrediKruger is offline
Registrado
 
Registrado: dic 2006
Posts: 2
Poder: 0
ALfrediKruger Va por buen camino
Descargando DLLs

Vale, un poblema:

Tengo una DLL de fabricacion propia q va bien, hace todo lo q tiene q hacer pero a la hora de cerrar la aplicacion q la utiliza me da un error (access violation) q me trae loco,

La dll se carga asi:

Código Delphi [-]
 result := 0;
//  if LibHand = 0 then
    LibHand := LoadLibrary('myDLL.dll');
   if LibHand <> 0 then
     begin
       @DisplayModalForm := GetProcAddress(LibHand, 'DisplayModalForm');
    //cambio esto a funciones, devuelve un entero
       result := integer(DisplayModalForm(Pchar(AstrFormulario),VarrIdiomas, AintIdioma));
       //@DisplayModalForm := nil;
    end;
//    FreeLibrary(LibHand);
//    LibHand := 0;
    //ShowMessage('Liberado : ' + BoolToStr(blnIsFree));

Lo comentado son cosas q he probado... Lo unico q cambiaba el error era libhand := 0 q hacia q la direccion q daba error fuera la 0x00000

Libhand es una variable global de esa unidad y todo funciona ok... casca al cerrarse la aplicacion.... alguien ve algo feo? me voi a suicidar!!!!

Última edición por dec fecha: 26-12-2006 a las 11:39:33.
Responder Con Cita
  #2  
Antiguo 26-12-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por ALfrediKruger
Código Delphi [-]
@DisplayModalForm := GetProcAddress(LibHand, 'DisplayModalForm');
En esta línea estás intentando cambiar la posición de memoria de DisplayModalForm. Como lógicamente eso no es posible (no se puede cambiar la posición de memoria de una variable), el compilador hace lo que puede y falla cuando se ejecuta.

Lo que me parece raro es que el compilador no falle al intentar compilar esa lína . ¿Seguro que no devuelve ningún error?
Responder Con Cita
  #3  
Antiguo 26-12-2006
ALfrediKruger ALfrediKruger is offline
Registrado
 
Registrado: dic 2006
Posts: 2
Poder: 0
ALfrediKruger Va por buen camino
Displaymodalform es una funcion:

TDisplayModalForm = function (AstrFormulario : PChar; var arrIdiomas : array of string; AintIdioma : shortint = 0) :integer

var
DisplayModalForm : TDisplayModalForm;

Mi intencion es asignar a esa variable el proceso que esta en la DLL cargada y q tiene el nombre entrecomillado...
Responder Con Cita
  #4  
Antiguo 26-12-2006
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
porque no pruebas así:

Código Delphi [-]
  libhand := LoadLibrary('mydll.dll');
    if libhand = 0 then begin
        ShowMessage ('DLL no disponible');
    end
    else begin
      @DisplayModalForm := GetProcAddress(libhand, 'DisplayModalForm');
      if @DisplayModalForm = nil then begin
          { function no found. misspelled? }
           ShowMessage ('función no encontrada, ¿llamada erronea?');
      end
      else begin
         { call the function as usually }
        result := integer(DisplayModalForm(Pchar(AstrFormulario),VarrIdiomas, AintIdioma));
      end;
    end;
    FreeLibrary(libhand);
Responder Con Cita
  #5  
Antiguo 26-12-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Sigo pensando que "@var := value" no es correcto: que yo sepa, el operador @ devuelve la dirección física de la variable o de la función/procedimiento al que se aplica. ¿Estoy equivocado? ¿O es que cambiaron la especificación de Pascal y no me enteré?
Responder Con Cita
  #6  
Antiguo 26-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Voy a dar un palo de ciego. Supongo que tanto el programa como la dll están creadas en delphi, pero ¿has añadido la unidad ShareMem a las uses?.

Cita:
Empezado por Ayuda de delphi
On Win32, if a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
usar DLLs lynu Varios 1 27-03-2007 02:57:53
Trabajando con dlls Novás Varios 2 23-08-2006 17:35:41
Descargando archivo .txt madman Internet 3 25-11-2005 08:46:10
Descargando archivos de actualizaciones de mi aplicación madman Internet 3 30-06-2003 17:32:05
DLLs de una aplicación emeceuy Varios 5 09-06-2003 12:55:52


La franja horaria es GMT +2. Ahora son las 16:42: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
Copyright 1996-2007 Club Delphi