Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con carga y descarga de una dll (https://www.clubdelphi.com/foros/showthread.php?t=93349)

Fita 13-08-2018 20:54:06

Problemas con carga y descarga de una dll
 
Hola a todos.
Tengo un error de Access Violation que no puedo resolver. El error solo ocurre cuando se carga la dll.
Estoy haciendo algo mal?

Desde ya muchas gracias
Codigo de muestra:

Código Delphi [-]
procedure cierraliquidacion(sender: tobject);
var cCodbar: string; 
     hMod: Thandle;
    GenRapipago: function(nCodempresa: integer; nLegajo: integer; nNroFactura: integer; nVto1: currency; nVto2: currency;  cFecJul_1: string; cFecJul_2: string): string; stdcall;
begin
if Liq000Agente.value <> 0 then // si el agente es > a 0 genera el codigo de barras y cargo la dll
begin
       hMod := loadlibrary('fitasoft2.dll');
end;

if (Liq000Agente.Value = 1) or (Liq000Agente.Value = 3) then
begin
      GenRapiPago := GetProcaddress(hMod, 'GenRapiPago'); // genera codigo de barras, llamo la funcion
end;

Tabla.Open;

// aca hago un do while generando el codigo de barras para cada registro
while not Res041.of do
begin
       cCodbar := '';

       if (Liq000Agente.value = 1) then
       begin
       cCodbar := GenRapiPago(IBLiq000NroEmpAgente.Value, Res041Codfam.Value, nroCompte, Res041Totrecibo.AsCurrency, 
       Res041Totrecibo2.AsCurrency, strFecJul_1, strFecJul_2);
       end;

       Tabla.Edit;
       TablaCodbarra.value := cCodbar;
       Tabla.post;
       Res041.next;
end;

Tabla.close;
Res041.Close;
        
if Liq000Agente.Value > 0 then
begin
       freeLibrary( hMod );
end;

Liq000.close;
showmessage('Proceso terminado'); 
// luego de dar ok al mensaje da el error Acces Violation, solo los que usan el codbar

end; // el debug me marca esta linea

Ñuño Martínez 14-08-2018 12:21:47

Hay dos posibilidades:
  1. Estás usando un recurso de dentro de la DLL fuera de ella, pudiendo haber una incompatibilidad dentro del marco de memoria (quizá el bloque está marcado como local y por eso no deja usarlo fuera de la DLL, si es que es posible hacer eso en Windows).
  2. O quizá estás liberando un recurso (¿la propia DLL?) antes de tiempo, o intentando acceder a dicho recurso tras su destrucción.
En cualquier caso habrá que ver qué es exactamente lo que provoca la violación de acceso.

Fita 14-08-2018 14:42:34

Gracias por tu respuesta Ñuño
Seguire investigando

Abrazo


La franja horaria es GMT +2. Ahora son las 15:11:35.

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