Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-03-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 29-03-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 30-03-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.271
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 30-03-2011
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
No has pensado en hacer el form de la validacion en una DLL?
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #5  
Antiguo 30-03-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
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,
Responder Con Cita
  #6  
Antiguo 30-03-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
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ª
Responder Con Cita
  #7  
Antiguo 02-05-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 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
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
Es posible ejecutar mi aplicacion desde otro programa ? gaston260 API de Windows 5 15-03-2011 00:15:30
ejecutar otro programa php srangel PHP 3 01-04-2005 17:11:27
ejecutar un programa dentro de otro migueilichenco Varios 1 28-11-2003 20:39:03
Ejecutar un programa DENTRO de otro programa seduerey Varios 8 12-11-2003 13:56:20
Ejecutar algo despues de WinExec u otro Tonio Varios 1 03-09-2003 15:46:23


La franja horaria es GMT +2. Ahora son las 12:36:53.


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