FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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; 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; |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
Gracias ESCAFANDRA, lo revisare!
|
#4
|
|||
|
|||
ESCAFANDRA, a que te refieres con "enviar un mensaje de usuario para que la APP se cierre ella misma"?
|
#5
|
||||
|
||||
Cita:
Si tu App es programada para cerrarse cuando recibe cierto mensaje, tu objetivo está completo. Saludos |
#6
|
|||
|
|||
Cita:
|
|
|
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 |
|