Pergunta

Estou construindo um aplicativo de serviço do Windows que tem uma configuração para compilá-lo como um aplicativo básico do Windows.O arquivo de projeto principal para o exe inclui condicionais que determinam se o projeto está sendo compilado como um aplicativo de serviço ou como um aplicativo de formulários do Windows.

O problema é que, quando faço algo que altera o código do projeto, o código é destruído e quebrado.Por exemplo, uma linha que diz Application.Initialize; torna-se AppliApplication.Initialize; e a linha que tem {$R *.RES} é cortada para S}, e a maioria das minhas condicionais é excluída.

Estou me perguntando se há uma maneira de superar esse problema, se há algum truque ou se eu só tenho que sorrir e aguentar?

Aqui está o arquivo abaixo, pois gostaria que ficasse ...

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.
Foi útil?

Solução

Como David disse, você está preso ao IDE acreditando que o dpr é seu próprio quintal privado.A solução mais fácil é ter tudo em uma unidade separada e remover as condicionais da cláusula de uso do dpr.FastMM será útil em sua versão de serviço, bem como em seu aplicativo de teste de qualquer maneira, e a distinção entre vcl.forms e vcl.svcMgr pode ser feita nessa unidade separada.

dpr seria reduzido 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;

E sua unidade de aplicativo principal pegaria o resto do código do 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.

Outras dicas

A resposta simples é apenas criar um projeto diferente e usá-lo como uma versão autônoma.Isso é o que eu faço com meus serviços e significa que você pode usar outras condicionais para se adequar a cada modo.

Sim, o IDE faz isso e sempre fez.Não há maneira conhecida de impedir que se comporte assim.Você só vai ter que engolir.

Tenho condicionais semelhantes e a maneira como lido com eles é usando meu sistema de controle de revisão para me ajudar, na hora do commit, a desfazer as mudanças que o IDE faz.Portanto, sempre que eu verifico um arquivo .dpr, eu reviso as diferenças e reverto as falsas.

Também tento adicionar e remover unidades do projeto editando o arquivo .dpr em vez de permitir que o IDE faça isso.Isso tende a reduzir a taxa de incidência dos mods falsos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top