Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Thumbs up Funciona bien sin lanzador

Hola.
Sí sí, sin utilizar el lanzador me funciona perfectamente ExitWindowsEx() para cualquier caso (o Flag), incluso poniendo ExitWindowsEx(EWX_FORCE); , pero necesito utilizar el lanzador que da permisos de administrador para que el programa pueda escribir en la base de datos que tengo implementada y el usuario que accede al Pc no.
Saludos

Última edición por PoZi fecha: 26-04-2006 a las 14:20:11.
Responder Con Cita
  #2  
Antiguo 07-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Buscate la funcion RunAndWait32 que anda por el foro.

El lanzador abre el programa de Bases de datos y se queda esperando con esa función hasta que termine el programa de BBDD.

El programa de bases de datos pone el Timer en marcha y cuando el tiempo expire, informa al usuario y se cierra el programa.

Ahora que se ha cerrado, el lanzador continua su ejecución y cierra el sistema con el Logoff.

Como el programa lanzador se está ejecutando en el contexto de los demás procesos, si cerrará el sistema bien.

EDITO:
Código Delphi [-]
var 
StartupInfo: TStartupInfo; 
ProcessInfo: TProcessInformation; 
begin 
FillChar (StartupInfo, SizeOf(StartupInfo), #0); 
StartupInfo.cb := SizeOf(StartupInfo); 
Win32Check( CreateProcessWithLogonW( StringToOleStr('UsuarioConPermisos'),StringToOleStr ('Dominio'), 
StringToOleStr('Password'),0, StringToOleStr('Exe'), nil, 0, nil, StringToOleStr('DirectorioTrabajo'), 
StartupInfo, ProcessInfo ) ); 
  WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
ShutDownwindows(logoff+ewx_force);
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 07-04-2006 a las 00:19:20.
Responder Con Cita
  #3  
Antiguo 07-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Smile Buena idea

Hola Lepe.
Muy buena idea. Probaré lo que me dices y ya os contaré pero estoy seguro que funcionará.
Muchas Gracias de verdad. Os felicito por esta gran comunidad.

Saludos
Responder Con Cita
  #4  
Antiguo 24-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Unhappy

Hola¡¡¡
Perdonenme por haber respondido tan tarde, pero he estado probando cosas y no he podido antes.
La idea que me dio Lepe funciona bien salvo cuando el lanzador se encuentra esperando la finalización del programa prinicipal (en WaitForSingleObject) y el usuario pulsa logoff. En este caso windows no puede cerrar el lanzador puesto que se encuentra ocupado y aparece la pantalla de End Now o Cerrar ahora. Si le pulso al botón,el programa efectivamente se cierra pero el código del evento OncloseQuery, donde almaceno la hora y fecha de salida del usuario, no se ejecuta.
Por cierto les informo, por si a alguien le puede interesar, que al usar la función CreateProcessWithLogonW aparte de dejar de funcionar la función ExitWindowsEx también lo hace el evento OnCloseQuery del programa lanzado. Por ese motivo yo he tenido que guardar los datos de salida del usuario desde el lanzador, pero como ven no consigo hacerlo .
Responder Con Cita
  #5  
Antiguo 25-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Mira este hilo que he "reabierto" hace unos minutos, creo que los tiros van por ahí.

El mensaje de roman, como siempre, no tiene desperdicio .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 25-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Hola¡¡¡

He probado lo que me dices Lepe y lamentablemente no me funciona: He hecho todo lo que dice Roman, he probado a guardar los datos en la función WMEndSession, en la WMQueryEndSession, con Msg.Result:=1 sin él.... y nada.
Parece ser que al lanzar el programa con Createprocesswithlogon se crea un proceso aislado del resto como si estuviera en una sesión distinta y para windows es como si no existiera (lo tiene marginado); Por eso ni funciona el ExitwindowsEx ni el evento OnCloseQuery ya que no le manda los mensajes EndSession ni QueryEndSession.

También he probado lo siguiente: Al lanzador le he quitado WaitForSingleObject y ShutDownWindows y le he puesto, como explica en el foro Roman, lo siguiente:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetProcessShutDownParameters($100, 0);
end;
 
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  WinSesionFin := true;
  inherited;
end;

procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
  WinSesionFin := Msg.EndSession;
  inherited;
end;


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if WinSesionFin then
    begin
      GuardarDatosSalida; (*Guarda la hora y fecha en una tabla*)
      CanClose := true;
    end
  else
    begin
      ExitWindowsEx(EWX_FORCE,0);
      Application.Terminate;
   end;
end;

De esta forma al hacer un log off se guarda la hora y fecha de salida, puesto que no está ocupado con WaitForSingleObject, y cuando quiera cerrar la sesión de windows desde el programa principal solo tengo que cerrar el lanzador para que se ejecute el código del evento OnCloseQuery y esto lo he hecho con la función KillTask (ver código). Pero al cerrarlo no se ejecuta el evento OnCloseQuery, sólo cierra el proceso y ya está.
Saludos¡¡¡

Última edición por PoZi fecha: 26-04-2006 a las 14:23:51.
Responder Con Cita
  #7  
Antiguo 25-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Pero a ver....

El usuario pulsa Logoff... pero ¿donde?

Se supone que el usuario pulsa un botón que dice Logoff en tu programa de BBDD, pero en realidad lo que hace tu programa de BBDD es cerrarse él (Application.Terminate, o bien cerrar el Form Principal), y puesto que el lanzador está esperando ese momento, el lanzador es el que continúa su ejecución y hace el Logoff del sistema.

¿no quedamos en eso?

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Dar privilegios del SYSDBA a otro usuario Eolo Firebird e Interbase 3 21-03-2004 05:48:15
Roles - Usuarios y privilegios Osorio Firebird e Interbase 2 13-02-2004 23:34:31
Privilegios en interbase acrophet Conexión con bases de datos 1 09-02-2004 15:07:35


La franja horaria es GMT +2. Ahora son las 23:40:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi