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 03-03-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
Codigo para cerrar una aplicacion, no funciona

Encontré un código diseñado para hacer un "actualizador" de la aplicación principal, y la lógica detrás de el es la siguiente:

1 . la aplicación principal verifica la fecha del ejecutable (de la misma aplicación) contra la fecha de otro ejecutable en una carpeta en la red
2. si el ejecutable en la red es mas reciente que el ejecutable actual, la aplicación principal ejecuta el "actualizador"
3. el actualizador cierra la aplicación principal, realiza la actualización del ejecutable y ejecuta nuevamente la aplicación principal
4. el actualizador se cierra.

el problema esta en el punto 3, por que el actualizador no cierra la aplicación principal, por consiguiente no puede realizar la actualización (si ejecuta la aplicación principal, lo verifique quitando el código que copia el ejecutable)


este es el código del actualizador :
Código:
uses tlhelp32, ShellApi;

{$R *.dfm}

procedure CloseApplication(const ExeFileName: string);
var
  Entry: PROCESSENTRY32;
  hSnapShot, hProcess: THandle;
begin
     hSnapShot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     Entry.dwSize:= SizeOf(PROCESSENTRY32);
     if Process32First(hSnapShot, Entry) then
          while Process32Next(hSnapShot, Entry) do
               if Entry.szExeFile = ExeFileName then
               begin
                    hProcess := OpenProcess(SYNCHRONIZE + PROCESS_TERMINATE,
                                False,
                                Entry.th32ProcessID);

                    if hProcess <> 0 then TerminateProcess(hProcess, 0);

                    CloseHandle(hProcess);
               end;
end;

procedure Actualizar;
begin
     Sleep(4000);
     ShowMessage('Actualización terminada');
end;

procedure TForm1.FormActivate(Sender: TObject);
var
     I: Integer;
     xejecuta : boolean;
begin
     for I := 0 to ParamCount() do
     begin
         if ParamStr(I) = 'd9705s9909' then
         begin
               xejecuta := true;
               break;
         end
         else
               xejecuta := false;
     end;

     if xejecuta = false then
     begin
          MessageDlg('Este programa no puede ser ejecutado directamente.', mtError, [mbOK], 0);
          Application.Terminate;
     end
     else
     begin
          CloseApplication('asapm.exe');
          Actualizar;
          ShellExecute(Handle,
                         'open',
                         'asapm.exe',
                         nil,
                         nil,
                         SW_SHOWNORMAL);
          Close;
     end;
end;
realizando una prueba sencilla (con otro ejecutable que sustituyera la aplicación principal), si parece funcionar correctamente, aunque el código para llamar el actualizador es exactamente el mismo:

codigo que ejecuta el actualizador desde la aplicación principal:

Código:
               if (MessageDlg('Existe una nueva version del sistema, deseas actualizarlo en este momento?', mtWarning, [mbYes, mbNo], 0) = mrYes) then
               begin
                    ShellExecute(Handle,
                      'open',
                      'AU.exe',
                      Pchar('d9705s9909'),
                      nil,
                      SW_SHOWNORMAL);
               end;
alguna idea de por que no se cierre la aplicacion principal?
Responder Con Cita
  #2  
Antiguo 04-03-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No es recomendable matar una aplicación con TerminateProcess, sería mejor que la aplicación se cierre de forma natural, para ello el actualizador podría pasar un parámetro o enviar un mensaje de usuario para que la APP se cierre ella misma. Si quieres investigar esa vía, esto te puede interesar: Pasar parámetros en caliente



Si quieres cerrar a lo bruto con TerminateProcess, ten en cuenta que muchas veces hay problemas de permisos o privilegios que pueden impedirlo. Aquí tienes un ejemplo.




Saludos.
Responder Con Cita
  #3  
Antiguo 04-03-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
Gracias ESCAFANDRA, lo revisare!
Responder Con Cita
  #4  
Antiguo 04-03-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
ESCAFANDRA, a que te refieres con "enviar un mensaje de usuario para que la APP se cierre ella misma"?
Responder Con Cita
  #5  
Antiguo 04-03-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por ArtPortEsp Ver Mensaje
ESCAFANDRA, a que te refieres con "enviar un mensaje de usuario para que la APP se cierre ella misma"?
Si conoces el Hanle de una ventana (FindWindow) se le puede enviar un mensaje windows. Estos mensajes están definidos por un número entero del rango 0 - 018Fh. Apartir de 400h (WM_USER) son mensajes definidos por usuario.
Si tu App es programada para cerrarse cuando recibe cierto mensaje, tu objetivo está completo.


Saludos
Responder Con Cita
  #6  
Antiguo 04-03-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Si conoces el Hanle de una ventana (FindWindow) se le puede enviar un mensaje windows. Estos mensajes están definidos por un número entero del rango 0 - 018Fh. Apartir de 400h (WM_USER) son mensajes definidos por usuario.
Si tu App es programada para cerrarse cuando recibe cierto mensaje, tu objetivo está completo.


Saludos
Algun link para investigar al respecto?
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
Ejecutar un código al cerrar con el icono cerrar Angel.Matilla C++ Builder 3 31-03-2021 11:32:44
Cerrar informes TfrReport abiertos antes de cerrar aplicación Gregorio Cíber Impresión 0 23-10-2015 10:40:53
código para cerrar aplicación consola en Delphi 2010 kharen Varios 4 31-05-2011 17:01:40
código para cerrar aplicación gio013 OOP 2 23-05-2010 06:44:05
MDI(editor txt)al cerrar principal no funciona codigo d peticion pra guardar cambios ixMike Varios 2 08-04-2004 18:56:10


La franja horaria es GMT +2. Ahora son las 07:21:47.


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