Ver Mensaje Individual
  #7  
Antiguo 02-05-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Reputación: 0
delphijm Va por buen camino
Hola a todos,

De vuelta con el mismo tema...

Como comente en el ultimo mensaje, finalmente opte por crear una DLL en la que tenia una sola procedure que se encarga de ejecutar la aplicacion...

Desde un EXE diferente, declaro la DLL i en el evento del boton "Acceder", ejecuto la procedure de la DLL que me arranca la aplicacion (le paso como parametros, el usuario, etc...)...

Todo funciona perfecto hasta que, desde el formulario principal cierro la aplicacion... Entonces la procedure de la DLL finaliza, se devuelve el flujo al EXE i este, al cerrarse lanza un error de "Acces violation"...

Lo curioso es que el error solo lo da cuando lo ejecuto desde RAD Studio, si lo ejecuto desde Windows XP no da el error, en cambio si lo ejecuto desde Windows 2008 Server tambien da el error...

Por si podeis ayudarme aqui esta el codigo de la DLL y del EXE:

-
Código Delphi [-]

//---------------------------------------------
// DLL con la procedure que arranca la aplicacion
//----------------------------------------------
library logistica_app;

uses
  SysUtils,
  Classes,
  Forms,
  uUserData in '..\Cliente\uUserData.pas',
// Aqui el resto de units del proyecto ...

// Esta es la procedure que arranca la aplicacion...
procedure execAPP(user: String);
var
  oldHandle: THandle;
  begin
    global_usuario:=user;

    Application.Initialize;
    Application.Title := 'Gestion Logistica '+' ['+global_usuario+']';
    Application.CreateForm(TstylersDM, stylersDM);
    Application.CreateForm(TserverfuncDM, serverfuncDM);
    Application.CreateForm(TmensajesDM, mensajesDM);
    Application.CreateForm(TimagenesDM, imagenesDM);

// Este es el formulario principal... Para salir de el hago "close"
    Application.CreateForm(TfrmPrincipal, frmPrincipal);
    Application.Run;

  end;


exports
  execAPP;

{$R *.res}

begin


end.

El codigo del EXE es este (resumiendo):

Código Delphi [-]

unit fINICIO;

interface

uses
    Windows, Messages, ....

type
   TfrmInicio = class(TForm)
// Aqui los paneles, los edits, botones, etc...
   private
      ...
   public

   end;

  // AQUI la declaracion de la procedure que arranca la aplicacion dentro de la DLL

var
  procedure execAPP(user: String); stdcall external 'logistica_app.dll';

implementation

// ... Aqui funciones varias de gestion de eventos
//...


// Aqui donde se llama a la procedure de la DLL.

procedure TfrmInicio.IniciarAplicacion(user: String);
begin
  Hide;    // Hide de este formulario para que al arrancar la aplicacion
             // este formulario se esconda.


  execAPP(user, appHandle);  // Ejecutamos la aplicacion. Hasta aqui todo bien

  // Una vez salimos de la aplicacion que se ha ejecutado desde la DLL
  // hacemos un close de este formulario para acabar definitivamente.

  // Y ES AQUI DONDE ME APARECE EL ERROR.
  // Aunque comente el "close" el error aparece cuando cierro el formulario
  // manualmente.
  Close;
end;

Parece como si el "objeto" Application del EXE ya no exista al volver de la DLL... Pero parece que deberian ser diferentes...

No se, si alguien puede ayudarme se lo agradecere...

Un saludo

Josep Mª
Responder Con Cita