tagger tag windows delphi windows-services

tag - Una aplicación Delphi independiente que también se puede instalar como servicio de Windows



tag folders (5)

Es posible, pero en ese caso no puede usar TServiceApplication y TService normales. Debe implementar todo el código específico del servicio usted mismo.

Tuvimos un problema similar e hicimos dos aplicaciones de cuadros: una para el ejecutor solo de arena y otra para el servicio. Ahora podemos crear un único BPL / DLL que esté integrado en ambos contenedores.

Si quiere gastar algo de dinero: debería mirar a SvCOM, creo que tienen una solución al problema.

En Delphi puede crear una aplicación independiente de Windows VCL Forms. También puede crear una aplicación de servicio de Windows.

¿Es posible combinar los dos en una sola aplicación que se puede ejecutar como una aplicación independiente y también se puede instalar como un servicio de Windows?


Hay una solución para este problema sin escribir una sola línea de código. Depende un poco de tu aplicación, pero en general es alcanzable. Pruebe esto: http://iain.cx/src/nssm . No olvide iniciar todos los servicios de los que depende su aplicación ANTES de iniciar su aplicación como un servicio. Busque en Google información sobre cómo hacerlo.


Otra opción casi más simple está disponible en http://cc.embarcadero.com/item/19703 , solo necesita incluir una unidad y cambiar su DPR a algo como:

begin if CiaStartService(''SERVICE NAME'') then begin CiaService.CreateForm(TMain, Main); CiaService.Run; Exit; end; Application.Initialize; Application.Title := ''SERVICE NAME''; Application.CreateForm(TMain, Main); Application.Run; end.

Si bien este ejemplo ahora es bastante anticuado, la técnica es lo suficientemente simple como para que funcione, incluso con Delphi XE2. Con esto en su lugar, su aplicación continuará operando como no-servicio hasta que use el parámetro " / install " (en un símbolo del sistema elevado). Después de lo cual funcionará como un servicio hasta que use el parámetro " / uninstall " (también en un símbolo del sistema elevado).


Será difícil de explicar, pero lo intentaré :)

Lo hice en mi proyecto de esa manera (Delphi 5):

program TestSvc; uses SvcMgr, SvcMain, //the unit for TTestService inherited from TService ... ; var IsDesktopMode : Boolean; function IsServiceRunning : Boolean; var Svc: Integer; SvcMgr: Integer; ServSt : TServiceStatus; begin Result := False; SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); if SvcMgr = 0 then Exit; try Svc := OpenService(SvcMgr, ''TestService'', SERVICE_QUERY_STATUS); if Svc = 0 then Exit; try if not QueryServiceStatus(Svc, ServSt) then Exit; Result := (ServSt.dwCurrentState = SERVICE_RUNNING) or (ServSt.dwCurrentState = SERVICE_START_PENDING); finally CloseServiceHandle(Svc); end; finally CloseServiceHandle(SvcMgr); end; end; begin if (Win32Platform <> VER_PLATFORM_WIN32_NT) or FindCmdLineSwitch(''S'', [''-'', ''/''], True) then IsDesktopMode := True else begin IsDesktopMode := not FindCmdLineSwitch(''INSTALL'', [''-'', ''/''], True) and not FindCmdLineSwitch(''UNINSTALL'', [''-'', ''/''], True) and not IsServiceRunning; end; if IsDesktopMode then begin //desktop mode Forms.Application.Initialize; Forms.Application.Title := ''App. Title''; ShowTrayIcon(Forms.Application.Icon.Handle, NIM_ADD); // This function for create an icon to tray. You can create a popupmenu for the Icon. while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; ShowTrayIcon(Forms.Application.Icon.Handle, NIM_DELETE); // for delete the tray Icon end else begin // Service mode SvcMgr.Application.Initialize; SvcMgr.Application.CreateForm(TTestService, TestService); SvcMgr.Application.Run; end; end.


Totalmente posible El truco es editar el .dpr para crear el formulario principal cuando desee ejecutarlo como una aplicación y el formulario de servicio cuando desee ejecutarlo como un servicio. Me gusta esto:

if SvComFindCommand(''config'') then begin //When run with the /config switch, display the configuration dialog. Forms.Application.Initialize; Forms.Application.CreateForm(TfrmConfig, frmConfig); Forms.Application.Run; end else begin SvCom_NTService.Application.Initialize; SvCom_NTService.Application.CreateForm(TscmServiceSvc, scmServiceSvc); SvCom_NTService.Application.Run; end;

El código anterior utiliza SvCom para ejecutar el servicio, pero se puede lograr exactamente el mismo efecto utilizando el TService estándar.

Escribí un artículo sobre eso para The Delphi Magazine hace muchos años. Puedes leerlo aquí: Muchas caras de una aplicación .