Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-07-2025
_Io _Io is offline
Miembro
 
Registrado: ene 2024
Posts: 114
Poder: 3
_Io Va por buen camino
TService , no arranca

Hola, buenas tardes.

He buscado en el foro y se habla mucho de este tema, pero no he sabido encontrar la respuesta de el porqué no arranca.

Este sería el código, más o menos parecido a alguno que he visto en el foro:

Código Delphi [-]
program Project1;

uses
  Vcl.SvcMgr,
  Unit1 in 'Unit1.pas' {Service1: TService};

{$R *.RES}

begin
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TService1, Service1);
  Application.Run;
end.


Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  extctrls;

type
  TService1 = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    tmr :TTimer;

  private
    procedure Ontimer(Sender: TObject);
    procedure WriteLog(cMsg:String);

  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;

implementation

{$R *.dfm}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;


procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin

  beep;

  WriteLog('ServiceStart');

  tmr:=TTimer.Create(nil);
  tmr.Interval:=1000;
  tmr.OnTimer:=Ontimer;
  tmr.Enabled:=true;

  Started:=true;

end;


procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin

  beep;

  WriteLog('ServiceStop');

  if assigned(tmr) then
  begin

    tmr.Enabled:=false;
    freeandnil(tmr);

  end;

  Stopped:=true;

end;

procedure TService1.Ontimer(Sender: TObject);
begin

  beep;

  WriteLog('Ontimer');

end;



procedure TService1.WriteLog(cMsg:String);
var
  myFile : TextFile;
  cFile  : string;

begin

  Try
     cFile := 'C:\Users\Papá\Desktop\Desarrollo\Documentos\DOCs\Service_Test.txt';

     AssignFile(myFile, cFile);
     if fileExists(cFile) then
           Append(myfile)
     else
           ReWrite(myFile);

     WriteLn(myFile, FormatDateTime('yyyy-mmm-dd hh:mm:ss',now)+ ' '+ cMsg);

  finally

    CloseFile(myFile);

  end;

end;

end.

¿Podéis ver el motivo?

Muchas Gracias.
Responder Con Cita
  #2  
Antiguo 10-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
⚠️ PROBLEMA PRINCIPAL: Uso de TTimer en un servicio de Windows
Los servicios NO tienen una interfaz de usuario ni un loop de mensajes visual (como Application.ProcessMessages), por lo que TTimer no funciona como esperas. El TTimer depende del mensaje WM_TIMER, que no se procesa en un servicio como sí en una app VCL normal.

✅ SOLUCIÓN 1: Usa un hilo (TThread) en lugar de TTimer
Así sí puedes ejecutar tareas cada X segundos sin bloquear el servicio.

🧠 Alternativa funcional:

Código Delphi [-]
type
  TWorkerThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TWorkerThread.Execute;
begin
  while not Terminated do
  begin
    TService1(Service1).WriteLog('Thread running...');
    Sleep(1000); // Espera 1 segundo
  end;
end;


Y en ServiceStart:

Código Delphi [-]
var
  thread: TWorkerThread;
begin
  WriteLog('ServiceStart');
  thread := TWorkerThread.Create(False);
  Started := True;
end;

Y no olvides terminarlo en ServiceStop si lo mantienes como miembro de la clase.

⚠️ OTRO PROBLEMA: Beep
No uses Beep en servicios. No está permitido en contexto de servicio (no hay usuario con escritorio para oírlo), y puede incluso tirar errores. Quita todas las llamadas a Beep.

⚠️ OTRO DETALLE: Acceso a ruta de usuario desde un servicio
Estás escribiendo el log en:

Código Delphi [-]
C:\Users\Papá\Desktop\...

⚠️ Los servicios se ejecutan como SYSTEM por defecto, no como el usuario que tú eres. Esto significa que esa ruta probablemente no exista o no tenga permisos para escribir.

✅ Solución:
Cambia la ruta del log a una más accesible, como:

Código Delphi [-]
cFile := 'C:\ServiceLogs\Service_Test.txt';

Y asegúrate de que exista la carpeta y tenga permisos.

Última edición por navbuoy fecha: 10-07-2025 a las 22:22:32.
Responder Con Cita
  #3  
Antiguo 10-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
✅ CÓDIGO MODIFICADO: Unit1.pas

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.SvcMgr;

type
  TService1 = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    FWorkerThread: TThread;
    procedure WriteLog(const cMsg: String);
  public
    function GetServiceController: TServiceController; override;
  end;

var
  Service1: TService1;

implementation

{$R *.dfm}

type
  TWorkerThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TWorkerThread.Execute;
begin
  while not Terminated do
  begin
    TService1(Service1).WriteLog('Thread tick...');
    Sleep(1000); // 1 segundo
  end;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  WriteLog('ServiceStart');
  FWorkerThread := TWorkerThread.Create(False); // false = empieza ya
  Started := True;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  WriteLog('ServiceStop');
  if Assigned(FWorkerThread) then
  begin
    FWorkerThread.Terminate;
    FWorkerThread.WaitFor;
    FreeAndNil(FWorkerThread);
  end;
  Stopped := True;
end;

procedure TService1.WriteLog(const cMsg: String);
var
  myFile: TextFile;
  cFile: string;
begin
  try
    // Usa ruta sin permisos de usuario
    cFile := 'C:\ServiceLogs\Service_Test.txt';
    ForceDirectories(ExtractFilePath(cFile));
    AssignFile(myFile, cFile);

    if FileExists(cFile) then
      Append(myFile)
    else
      ReWrite(myFile);

    WriteLn(myFile, FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' ' + cMsg);
  finally
    CloseFile(myFile);
  end;
end;

end.

✅ PASOS EXTRAS
Crea la carpeta C:\ServiceLogs manualmente, o dale permisos para que el servicio pueda crearla.

Instala el servicio:

Código:
MyService.exe /INSTALL
Arráncalo desde Servicios de Windows (services.msc).

Mira el archivo de log en C:\ServiceLogs\Service_Test.txt.
Responder Con Cita
  #4  
Antiguo 11-07-2025
_Io _Io is offline
Miembro
 
Registrado: ene 2024
Posts: 114
Poder: 3
_Io Va por buen camino
Buenos Días.

Muchas Gracias por tu detallada respuesta, me ha servido de mucho, sobre todo para conocer sobre este tema.

Algo debo estar haciendo mal, porque sigue sin funcionar. No hace nada.

El código está tal cual tu propuesta, te digo cómo lo hago:
Cita:
1º.- Creo el ejecutable del servicio (C:\Users\Papá\Desktop\Desarrollo\exes\ChK_Service.exe)
2º.- Ejecuto consola como administrado y me dirijo a la localización del exe (cd c:\users\.... ))
3º.- Ejecuto ".\ChK_Service.exe /install" => Sale el mensaje de servicio instalado correctamente
4º.- Ejecuto Services como administrador.
5º.- Busco el servicio y lo inicio, una vez iniciado, me salen las opciones de detener y pausar.
Como me indicaste, cree manualmente la carpeta "ServiceLogs", pero no crea el archivo.

Volverte a agradecer la ayuda.
Responder Con Cita
  #5  
Antiguo 11-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
Que no cree el archivo Service_Test.txt suele deberse a una de estas tres causas claras, especialmente en servicios:

🧨 1. El servicio no tiene permisos para escribir en C:\ServiceLogs\
Aunque tú puedes escribir ahí, el servicio corre por defecto como LocalSystem, que tiene permisos algo diferentes, especialmente en discos NTFS modernos.

✅ Solución:
Dale permisos de escritura a Todos (Everyone) sobre la carpeta:

Crea manualmente C:\ServiceLogs\.

Clic derecho → Propiedades → Seguridad → Editar permisos.

Añade Todos (Everyone) y dale control total o al menos “Modificar”.

🧨 2. El directorio no existe y ForceDirectories falla silenciosamente
Aunque ForceDirectories(...) se supone que lo crea, en contexto de servicio puede fallar sin lanzar excepción (por seguridad del sistema).

✅ Solución:
Crea manualmente la carpeta antes de arrancar el servicio:

Código:
C:\ServiceLogs\
No lo hagas depender del código.

✅ Debug temporal: escribe en archivo del sistema
Como prueba temporal, cambia la ruta a algo más accesible:

Código Delphi [-]
cFile := 'C:\Windows\Temp\Service_Test.txt';
Si ahí sí te crea el archivo, entonces el problema es 100% de permisos en C:\ServiceLogs.

✅ Alternativa limpia: usar carpeta pública
Si no quieres lidiar con permisos, escribe aquí:

Código Delphi [-]
cFile := IncludeTrailingPathDelimiter(GetEnvironmentVariable('PUBLIC')) + 'Documents\Service_Test.txt';

Esto apunta a algo como:

Código Delphi [-]
C:\Users\Public\Documents\

Que suele tener permisos de escritura incluso para servicios.
Responder Con Cita
  #6  
Antiguo 11-07-2025
_Io _Io is offline
Miembro
 
Registrado: ene 2024
Posts: 114
Poder: 3
_Io Va por buen camino
Hola, buenas tardes.

Nada, sigue igual, pero hay unas particularidades.

En Windows 11 Home, arranco el servicio, después voy al administrador de tareas y en servicios, NO aparece tampoco.
En Windows 10 Home, arranco el servicio, después voy al administrador de tareas y en servicios, SI aparece, pero tampoco
crea el archivo.

Ahora me he dado cuenta que en todas las carpetas aparece el checkBox "Solo lectura (solo para archivos de la carpeta)" activado y
no se puede desactivar, pero la cosa es que me deja acceder a la carpeta y crear archivos, no sé exactamente que sentido tiene.

De momento voy a continuar desarrollando el hilo para verifactu y cuando de con la tecla de lo qué está pasando lo incorporo al servicio.

Muchas Gracias por la ayuda, cualquier comentario, idea que quieras darme será bienvenida.

Volver a agradecerte tu ayuda
Responder Con Cita
  #7  
Antiguo 11-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
El problema clave
Windows 10/11 Home Edition NO permite servicios creados por el usuario de forma convencional (como en Pro).
En concreto:

No soporta por completo la infraestructura de servicios personalizados, especialmente si no usas instaladores con privilegios elevados.

Tu servicio probablemente no se está instalando correctamente, aunque creas que sí arranca.

Si no aparece en services.msc o el Administrador de tareas → pestaña Servicios, entonces no está registrado como servicio del sistema.

¿Por qué aparece en Windows 10 Home pero no en 11?
Windows 10 Home aún permite más tolerancia con servicios mal registrados. Pero:

Aunque aparezca en la lista de servicios, no se ejecuta correctamente.

No tiene permisos de acceso a disco (ni siquiera para escribir logs).

TService se ejecuta en contexto restringido, sin permisos de escritorio, temporales, o acceso a rutas de usuario como C:\Users.

Conclusión
En Windows Home, los servicios hechos en casa no están del todo soportados.

Aunque el código esté bien, no ejecutará correctamente sin configuración y permisos adecuados.

Lo ideal es probar primero como app normal, y luego migrar a servicio en una edición Pro o usando un instalador con sc.exe.


✅ SOLUCIONES POSIBLES
OPCIÓN 1 — Ejecutar como aplicación normal (no servicio) para pruebas
Código Delphi [-]
// Usa esto como prueba en un TForm con un botón

procedure TForm1.Button1Click(Sender: TObject);
var
  myFile: TextFile;
begin
  AssignFile(myFile, 'C:\Temp\test_log.txt');
  Rewrite(myFile);
  WriteLn(myFile, 'Esto sí escribe desde una app normal.');
  CloseFile(myFile);
end;
👉 Si esto funciona, tu problema es 100% que el servicio no se ejecuta correctamente en modo real.

OPCIÓN 2 — Verifica e instala bien el servicio
Abre una consola como Administrador.

Navega a donde está tu .exe del servicio.

Instálalo:

Código:
MyService.exe /install
Luego ábrelo en services.msc, no en el Administrador de tareas.

Asegúrate de que:

Aparece en la lista.

Puedes hacer clic derecho → Iniciar.

No da error al arrancar.

OPCIÓN 3 — Cambia el usuario del servicio
Por defecto, el servicio se ejecuta como LocalSystem, que no puede acceder a carpetas de usuario. Cámbialo:

En services.msc, busca tu servicio.

Clic derecho → Propiedades → pestaña Iniciar sesión.

Marca "Esta cuenta" y pon tu cuenta de usuario de Windows.

Introduce la contraseña.

OPCIÓN 4 — Registra log en el Visor de Eventos (más fiable en servicios)
Agrega esto a WriteLog para registrar en el visor de eventos:

Código Delphi [-]
ReportEvent(
  RegisterEventSource(nil, 'MiServicio'),
  EVENTLOG_INFORMATION_TYPE,
  0, 0, nil,
  1, 0, @PChar(cMsg), nil
);
Es más confiable que escribir a disco bajo LocalSystem.

Última edición por navbuoy fecha: 11-07-2025 a las 21:33:25.
Responder Con Cita
  #8  
Antiguo 12-07-2025
_Io _Io is offline
Miembro
 
Registrado: ene 2024
Posts: 114
Poder: 3
_Io Va por buen camino
Hola, Buenas noches.


Cita:
OPCIÓN 1 — Ejecutar como aplicación normal (no servicio) para pruebas
Si, he empezado con una aplicación, que llama a un thread que desarrolla la lógica de verifactu, cuando llegue el momento retomaré el asunto del servicio.

Muchas Gracias !!!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TService sancarlos API de Windows 4 12-11-2008 10:14:25
TService y TForm Softweb API de Windows 5 20-10-2008 17:41:01
TService, IB, FB OSKR C++ Builder 0 27-04-2005 11:51:11
Imprimir desde un TService gynch Varios 2 02-04-2004 19:35:23
Imprimir desde un TService gynch Impresión 0 24-03-2004 14:12:16


La franja horaria es GMT +2. Ahora son las 08:51:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi