Ver Mensaje Individual
  #2  
Antiguo 09-12-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.759
Reputación: 7
ermendalenda Va por buen camino
Cita:
Empezado por razorxxx Ver Mensaje
Buenas a todos!

En mi empresa tenemos múltiples sistemas de facturación ya que programamos a medida para nuestros clientes. Es por ello que la adaptación a Veri*Factu la haremos haciendo uso de un subprograma que mostrará el registro de facturación asociado a una factura, gestionará los envíos y respuestas, las firmas, los registros de eventos, etc.

Como la mayoría de nuestras instalaciones son de tipo cliente-servidor, el subprograma en cuestión se ejecutará en el servidor y estará siempre disponible, y se mantendrá a la escucha para enviar los registros cada 60 segundos.

Lo que pasa es que este subprograma, por razones diversas, podría ocurrir que de repente se cuelgue y deje de estar disponible para el envío de las facturas. Por tanto, cada uno de nuestros SIF debería detectar antes o después de generar el registro de una factura si dicho subprograma está en ejecución en la máquina remota para, en caso contrario, ejecutarlo o que nos avise por mail de que no está ejecutándose, pues de lo contrario no se podrían remitir los registros de facturación a la AEAT.

¿Alguno de ustedes sabe cómo puede consultarse desde un equipo si en otro equipo de la red existe un proceso en ejecución? Tras algunas consultas a Google y otras a Copilot, he estado probando la api de WMI pero hasta ahora no consigo que funcione. Mi código es el siguiente:

Código:
var
   SWbemLocator: OLEVariant;
   SWbemServices: OLEVariant;
   SWbemObjectSet: OLEVariant;
   SWbemObject: OLEVariant;
   Enum: IEnumVariant;
   Value: Cardinal;
begin
     Result := False;
     SWERROR := 0;
     try
        CoInitialize(nil);
             try
                SWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
                If CBCredenciales.Checked Then  // Si la máquina remota tiene autenticación
                    SWbemServices := SWbemLocator.ConnectServer(RemoteMachine, 'root\CIMV2', Usuario.Text, Password.Text)
                Else
                    SWbemServices := SWbemLocator.ConnectServer(RemoteMachine, 'root\CIMV2', '', '');
                SWbemObjectSet := SWbemServices.ExecQuery(Format('SELECT * FROM Win32_Process WHERE Name = "%s"', [ProcessName]));
                Enum := IUnknown(SWbemObjectSet._NewEnum) as IEnumVariant;
                while Enum.Next(1, SWbemObject, Value) = S_OK do
                begin
                     Result := True;
                     SWbemObject := Unassigned;
                end;
             finally
                    CoUninitialize;
             end;
     except
           on E: EOleException do
           begin
                SWERROR := 1;
                Memo1.Lines.Add(Format('Error %d : ($%x) Mensaje : %s', [E.ErrorCode, E.ErrorCode, E.Message]));
           end;
           on E: Exception do
           begin
                SWERROR := 1;
                Memo1.Lines.Add('Error ' + E.Classname + ': ' + E.Message);
           end;
     end;
end;
Casi seguro está relacionado con temas de firewall y puertos en la máquina remota, porque si activo o desactivo el Firewall recibo errores diferentes.
Puedes crear un archivo bloqueado(locked mode) y lo dejas abierto en el programa del srvidor, cuando esté cerrado dicho programa, el archivo se desbloqueará y los programas de cliente que intenten escribir algo en ese archivo y si deja (no devolviendo error de bloqueo) es que está cerrado.

Última edición por ermendalenda fecha: 09-12-2024 a las 12:25:45.
Responder Con Cita