Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con Servicio para copiar programas (https://www.clubdelphi.com/foros/showthread.php?t=82587)

shoulder 21-03-2013 14:52:35

Problema con Servicio para copiar programas
 
Hola tengo un problema, hice un servicio que actualiza los programas en el servidor de 4 a 5 de la mañana, el servicio funciona bien, compara si las versiones de los prg son distintas actualiza, el tema es que si un programa esta en uso o no lo puede copiar por algún problema se frena el servicio y no continua, cuando detengo el servicio termina de actualizar todo. Si pruebo el programa como un form comun aunque exista algun problema entre los prg a actualizar copia hasta el final. No se como solucionar esto.

Les dejo las funciones y como hice el prg. Gracias!!!!

El Servicio que copia el programa con un timer cada 5 minutos en ese lapso de horas :

Cita:

Procedure TServiceActua.Timer1Timer(Sender: TObject);

Var
V : TVSFixedFileInfo;
archiant, archipos : string;

begin

hora := copy(datetimetostr(now()),11,6);

if copy(datetimetostr(now()),13,1) = ':' then
hora := '0'+ copy(datetimetostr(now()),12,4);





hora1 := '04:57';

if ((strtotime(hora) > strtotime('03:57'))
and (strtotime(hora) < strtotime(hora1)) ) then
begin


V := GetFileVersion('\\xxx\Venta1\xxx\Pruebax.exe');

archiant:= Format('%d.%d',
[HiWord(V.dwFileVersionMS),
LoWord(V.dwFileVersionMS)]) ;



V := GetFileVersion('\\xxx\Venta1\Pruebax.exe');

archipos:= Format('%d.%d',
[HiWord(V.dwFileVersionMS),
LoWord(V.dwFileVersionMS)]) ;


if archiant <> archipos then
begin
copiatodo('\\xxx\Venta1\xxx\Pruebax.exe','\\xxx\Venta1\Pruebax.exe');
end;

archiant := '';
archipos := '';


V := GetFileVersion('\\xxx\Venta1\xxx\Prueba2.exe');

archiant:= Format('%d.%d',
[HiWord(V.dwFileVersionMS),
LoWord(V.dwFileVersionMS)]) ;



V := GetFileVersion('\\xxx\Venta1\Prueba2.exe');

archipos:= Format('%d.%d',
[HiWord(V.dwFileVersionMS),
LoWord(V.dwFileVersionMS)]) ;


if archiant <> archipos then
begin
copiatodo('\\xxx\Venta1\xxx\Prueba2.exe','\\xxx\Venta1\Prueba2.exe');
end;

end;


Funcion que Copia



Cita:

function CopiaTodo(Origen,Destino : String) : LongInt;
var
F : TShFileOpStruct;
sOrigen, sDestino : String;
begin
Result := 0;
sOrigen := Origen + #0;
sDestino := Destino + #0;

with F do
begin
Wnd := 0 ;
// Application.Handle;
wFunc := FO_COPY;
pFrom := @sOrigen[1];
pTo := @sDestino[1];
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION
end;

Result := SHFileOperation(F);
end;

Cita:

Function GetFileVersion(AFileName : TFileName) : TVSFixedFileInfo;
Var
I : Cardinal;
P : Pointer;
Q : PChar;
Begin
I := GetFileVersionInfoSize(PChar(AFileName), I);
If (I > 0) Then
Begin
GetMem(P, I);
Try
GetFileVersionInfo(PChar(AFileName), 0, I, P);
VerQueryValue(P, '\', Pointer(Q), I);
Result := PVSFixedFileInfo(Q)^;
Finally
FreeMem(P);
End;
End
Else
FillChar(Result, SizeOf(TVSFixedFileInfo), #0);
End;

Ñuño Martínez 22-03-2013 10:25:07

Hola shoulder. La próxima vez utiliza las etiquetas [delphi]...[/delphi], son más apropiadas que [quote]...[/quote].

Respecto a tu problema, coligo que el problema es que no tratas las excepciones, así que cuando se encuentra con una (no puede copiar un archivo porque está en uso) todo se para. Deberías poner uno o dos "TRY ... EXCEPT ... END;" en el proceso de copia para evitar que se extienda hasta salir del programa.

shoulder 22-03-2013 16:02:41

Problema con Servicio para copiar programas
 
Hola Gracias primero por responderme, probe con Try - Except pero no me funciono, se detiene el servicio y recien cuando lo bajo continua. lo raro cuando uso un form comun funciona todo bien.

shoulder 22-03-2013 16:46:22

con fFlags := FOF_NOERRORUI, ahora continua...

Ñuño Martínez 25-03-2013 13:47:19

Entonces, ¿está solucionado con el cambio en "fFlags"?

shoulder 25-03-2013 14:06:31

Si gracias!, agregando la flag en la función copiatodo, no se frena y continua hasta el final.

fFlags := FOF_NOERRORUI

shoulder 26-03-2013 20:07:40

Hola, hay alguna forma de cerrar una aplicacion cuando detecte por ejemplo 2 horas de inactividad?. Siguiendo con el servicio antes mencionado, funciona bien, pero hay personas que dejan la PC encendida con el programa abierto y no me actualiza el programa.

Casimiro Notevi 26-03-2013 20:16:04

Por favor, recuerda nuestras normas, abre un nuevo hilo para una pregunta que no tiene nada que ver con lo que se está tratando en este.


La franja horaria es GMT +2. Ahora son las 18:13:43.

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