Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar programa desde otro SIN WINEXEC (https://www.clubdelphi.com/foros/showthread.php?t=73059)

delphijm 29-03-2011 19:36:13

Ejecutar programa desde otro SIN WINEXEC
 
Hola a todos,

Os explico lo que quiero hacer por si alguien puede ayudarme...

Tengo una aplicacion creada con Delphi, se trata de un .EXE... Al arrancar aparece un formulario principal con su menu, etc....

Quiero que, antes de que aparezca este formulario, el usuario se valide indicando su "Codigo de usuario" y su "password"...

La solicitud de la validacion quiero hacerla en un proyecto EXE diferente... Si la validacion es correcta se debe de ejecutar el programa principal y el programa de validacion debe de finalizar ya que ya cumplio su funcion de validacion...

He probado con WinExec pero para pasarle el codigo de usuario al programa de la aplicacion tengo que hacerlo por parametro y, claro, no es un metodo que aporte demasiada seguridad...

Si alguien conoce un sistema para hacerlo...

Gracias

roman 29-03-2011 20:22:13

Si ambos programas están bajo tu control, puedes usar Memory Mapped Files para pasar información de uno a otro. En los foros se ha hablado varias veces de ello.

// Saludos

Neftali [Germán.Estévez] 30-03-2011 09:12:43

¿Hay alguna razón para pasar la validación a un formulario diferente?

Si te preocupa la seguridad, dividir la aplicación en 2 creo que decremente cláramente este punto, pues tienes que acabar pasando en control de uno a otro de alguna forma y eso es un punto débil.

Delfino 30-03-2011 12:11:13

No has pensado en hacer el form de la validacion en una DLL?

gatosoft 30-03-2011 17:14:41

Al tener dos programas diferentes, de cualquier forma vas a tener que hacer un llamado con WinExec y pasar al menos un parametro (que te indique cual es el memory-mapped-file que vas a utilizar)

Me adhiero a la pregunta de Neftalí..¿cuál es la razón para que sena dos programas separados?, a lo mejor pueda que haya otra alternativa.

Te comento un caso similar al que expones, por si te da ideas;

Yo tenia una aplicacion principal, que ocasionalmente debia llamar a otras aplicaciones, las cuales solo se ejecutaban si se les enviaba como parametro el usuario y clave adecuadas... (ademas de otros datos),

Lo que hice (no conocia los memory-mapped.files de los que habla roman), fue hacer el llamado con winexec, enciando como parametro un codigo, el cual correspondia a un archivo encriptado que despues de leido era borrado.

Este archivo ademas del usuario y clave, enviaba el Handle de la aplicacion uno a la dos para luego mantener una conversación entre las dos aplicaciones mediante "SendMessage"...

Un saludo,

delphijm 30-03-2011 19:01:26

Hola a todos,

Si, Delfino, he pensado en hacerlo usando DLL, de hecho lo estoy implementando asi y parece que podre obtener lo que pretendo... Me explico y asi respondo tambien la cuestion de Neftali:

La razon para hacerlo en dos formularios diferentes es que me interesa disponer del siguiente escenario:

- La aplicacion es cliente-servidor usando DataSnap via HTTP...
- En la parte del cliente se ejecutara un EXE que solamente pedira el usuario y el password y comunicara con el servidor para validarlo...
- Tambien en la parte del cliente existira una DLL que "encapsula" toda la aplicacion (formulario principal y todos los formularios etc)...
- Si la validacion que realiza el EXE es correcta, se ejecutara la procedure de la DLL que abre el formulario principal de la aplicacion, si la validacion no es correcta nunca llegara a ejecutarse esta llamada dando un mensaje de "Usuario o password incorrectos, vuelva a intentarlo, etc..."...
- El EXE que pide el usuario y password, ademas de conectarse con el servidor para validarse, tambien solicitara al servidor si existe una version mas actualizada de la DLL (que encapsula toda la aplicacion) y, si es asi, bajara del servidor la nueva DLL hacia el cliente para actualizar la aplicacion...
- Y esto ultimo es el motivo por el que me interesa que el programa EXE de validacion sea diferente de la DLL que encapsula toda la aplicacion, porque si fuera el mismo no podria sustituir el archivo que esta siendo ejecutado, en cambio con este sistema lo que sustituyo es la DLL que aun no se esta ejecutando... No se si me explico...

Ahora estoy con el tema del EXE ejecutando la procedure de la DLL que ejecuta la aplicacion y parece que funciona bien... Despues tendre que pelearme con el tema de como bajar la DLL del servidor si debe de actualizarse, aun no se como hacerlo pero indagare...

Por lo que se refiere a la privacidad del usuario y contraseña pienso que es una buena opcion ya que tanto el dato de "usuario" y "password" se trasladan desde el EXE de los inputs a la DLL de la aplicacion "internamente" como parametros de una procedure...

En principio, cuando la aplicacion ya se esta ejecutando despues de la validacion, no necesito comunicarme con el primer EXE, asi que lo que hago es un "Hide" antes de llamar a la procedure de ejecucion de la aplicacion para ocultarlo i listos...

Un saludo y gracias a todos...

Josep Mª

delphijm 02-05-2011 18:50:30

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ª


La franja horaria es GMT +2. Ahora son las 17:16:29.

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