Pregunta

Estoy creando una aplicación de servicio de Windows que tiene una configuración para compilarla como una aplicación básica de Windows.El archivo de proyecto principal para el exe incluye condicionales que determinan si el proyecto se está compilando como una aplicación de servicio o como una aplicación de Windows Forms.

El problema es que, cuando hago algo que hace que el código del proyecto cambie, el código se destruye y se rompe.Por ejemplo, una línea que dice Application.Initialize; se convierte en AppliApplication.Initialize; y la línea que tiene {$R *.RES} se reduce a S}, y la mayoría de mis condicionales se eliminan.

Me pregunto si hay una manera de superar este problema, si hay algún truco o si solo tengo que sonreír y soportarlo.

Aquí está el archivo a continuación, ya que me gustaría que se quedara ...

program JDRMServer;

uses
{$IFDEF TESTAPP}
  FastMM4,
  Vcl.Forms,
{$ELSE}
  Vcl.SvcMgr,
{$ENDIF TESTAPP}
  uJDRMServer in 'uJDRMServer.pas' {JDRMSvr: TService},
  uJDRMSessions in 'uJDRMSessions.pas',
  uJDRMSvrCli in 'uJDRMSvrCli.pas',
  uJDRMSvrDsh in 'uJDRMSvrDsh.pas',
  JDDB in 'JDDB.pas',
  uJDRMServerTEST in 'uJDRMServerTEST.pas' {JDRMSvrTest},
  uJDRMServerThread in 'uJDRMServerThread.pas',
  uJDRMSvrMessages in 'uJDRMSvrMessages.pas';

{$R *.RES}

begin

{$IFDEF TESTAPP}
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TJDRMSvrTest, JDRMSvrTest);
{$ELSE}
  if (not Application.DelayInitialize) or (Application.Installing) then
    Application.Initialize;
  Application.CreateForm(TJDRMSvr, JDRMSvr);
{$ENDIF TESTAPP}
  Application.Run;
end.
¿Fue útil?

Solución

Como dice David, estás atascado con el IDE creyendo que el dpr es su propio patio trasero privado.La solución más sencilla es tener todo en una unidad separada y eliminar los condicionales de la cláusula de usos de la dpr.FastMM será útil en su versión de servicio, así como en su aplicación de prueba de todos modos, y la distinción entre vcl.forms y vcl.svcMgr se puede hacer en esa unidad separada.

dpr se reduciría a:

uses
  FastMM4,
  YourAppMain,
  uJDRMServer,
  uJDRMSessions,
  uJDRMSvrCli in 'uJDRMSvrCli.pas',
  uJDRMSvrDsh in 'uJDRMSvrDsh.pas',
  JDDB in 'JDDB.pas',
  uJDRMServerTEST in 'uJDRMServerTEST.pas' {JDRMSvrTest},
  uJDRMServerThread in 'uJDRMServerThread.pas',
  uJDRMSvrMessages in 'uJDRMSvrMessages.pas';

{$R *.RES}

begin
  YourAppMain.Execute;
end;

Y su unidad de aplicación principal tomaría el resto del código del dpr:

unit YourAppMain;

interface

procedure Execute;

implementation

uses
{$IFDEF TESTAPP}
  Vcl.Forms,
{$ELSE}
  Vcl.SvcMgr,
{$ENDIF TESTAPP}
  OtherUnits;

procedure Execute;
begin
{$IFDEF TESTAPP}
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TJDRMSvrTest, JDRMSvrTest);
{$ELSE}
  if (not Application.DelayInitialize) or (Application.Installing) then
    Application.Initialize;
  Application.CreateForm(TJDRMSvr, JDRMSvr);
{$ENDIF TESTAPP}
  Application.Run;
end;

end.

Otros consejos

La respuesta simple es simplemente crear un proyecto diferente y usarlo como la versión independiente.Esto es lo que hago con mis servicios, y significa que puedes usar otros condicionales para adaptarse a cada modo.

Sí, el IDE hace eso y siempre lo ha hecho.No hay forma conocida de evitar que se comporte así.Vas a tener que aguantarte.

Tengo condicionales similares y la forma en que los trato es usar mi sistema de control de revisiones para ayudarme, en el momento de confirmar, deshacer los cambios que hace el IDE.Entonces, cada vez que reviso un archivo .dpr, reviso las diferencias y revierto las falsas.

También trato de agregar y eliminar unidades del proyecto editando el archivo .dpr en lugar de dejar que el IDE lo haga.Esto tiende a reducir la tasa de incidencia de modificaciones falsas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top