PDA

Ver la Versión Completa : Matar un Archivo de Excel desde Delphi


raverri
22-07-2007, 02:20:14
Cordial Saludo.

Estoy desarrollando una aplicación que requiere matar un archivo de Excel que ha superado un determinado tiempo de ejecución (time out).

He consultado en los foros y he encontrado que se puede matar una aplicación ejecutable (exe) pero en mi caso no aplicaría porque en el pc hay varias aplicaciones de excel corriendo diferentes archivos.

Por ejemplo si hay tres aplicaciones de Excel ejecutándose simultáneamente (Archivo1.xls, Archivo2.xls, Archivo3.xls) en el administrador de procesos saldría:

EXCEL.EXE
EXCEL.EXE
EXCEL.EXE

La pregunta es hay algún modo de saber el nombre del archivo de Excel (*.xls) que se está ejecutando con la aplicación para poder matarlo?

Cada archivo se abre en una aplicación de Excel diferente.

Espero haberme hecho entender.


Muchas Gracias por la ayuda.

Neftali [Germán.Estévez]
23-07-2007, 09:58:56
¿El título de las tres ventanas de Excel es diferente?
¿Indicativo del archivo?

Lo digo porque eso te podría servir para acceder al HAndle de la ventana distinguiendolas por el título.
API FindWindows.

¿Hay esa posibilidad?

raverri
23-07-2007, 19:39:16
Gracias por contestar el mensaje.

Efectivamente cada aplicación de Excel tiene un título diferente en la ventana y con FindWindow podría buscarla y tratar de cerrarla con estas instrucciones:


procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow(nil, 'Título Ventana Principal');
if h <> 0 then PostMessage(h, WM_CLOSE, 0, 0);
end;

Pero en este mismo foro leí que en realidad este método no "mata" del todo a la aplicación
ni libera los recursos. De hecho la probé pero el archivo de Excel sigue en uso.


También veo que el handles que devuelve con FindWindow no tiene ninguna relación
con el id del proceso en el administrador de tareas.

Te agradezco cualquier otro comentario o recomendación al respecto.

Neftali [Germán.Estévez]
24-07-2007, 10:40:06
¿Has probado con el mensaje WM_QUIT en lugar del WM_CLOSE?