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.