Frage

Ich erstelle eine Windows-Dienstanwendung mit einer Konfiguration zum Kompilieren als grundlegende Windows-Anwendung.Die Hauptprojektdatei für die exe enthält Bedingungen, die bestimmen, ob das Projekt als Dienstanwendung oder als Windows Forms-Anwendung kompiliert wird.

Das Problem ist, wenn ich etwas tue, das den Projektcode ändert, wird der Code zerstört und beschädigt.Beispielsweise wird eine Zeile mit der Angabe "Application.Initialize;" zu "AppliApplication.Initialize;" und die Zeile mit "{$R *.RES}" wird zu "S}" gekürzt, und die meisten meiner Bedingungen werden gelöscht.

Ich frage mich, ob es einen Weg gibt, dieses Problem zu lösen, ob es irgendwelche Tricks gibt oder ob ich nur grinsen und es ertragen muss?

Hier ist die Datei unten, da ich möchte, dass sie bleibt ...

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.

War es hilfreich?

Lösung

Wie David sagt, stecken Sie in der IDE fest und glauben, dass der dpr sein eigener privater Hinterhof ist.Die einfachste Lösung besteht darin, alles in einer separaten Einheit zu haben und die Bedingungen aus der Verwendungsklausel des dpr zu entfernen.FastMM ist ohnehin sowohl in Ihrer Serviceversion als auch in Ihrer Test-App nützlich, und die Unterscheidung zwischen vcl.forms und vcl.svcMgr kann in dieser separaten Einheit vorgenommen werden.

dpr würde reduziert auf:

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;

Und Ihre Hauptanwendungseinheit würde den Rest des Codes aus dem dpr: übernehmen

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.

Andere Tipps

Die einfache Antwort besteht darin, einfach ein anderes Projekt zu erstellen und dieses als eigenständige Version zu verwenden.Dies ist, was ich mit meinen Diensten mache, und es bedeutet, dass Sie andere Bedingungen verwenden können, um jedem Modus zu entsprechen.

Ja, die IDE macht das und hat es immer getan.Es gibt keinen bekannten Weg, um zu verhindern, dass es sich so verhält.Sie müssen es nur aufsaugen.

Ich habe ähnliche Bedingungen und gehe mit ihnen um, indem ich mein Revisionskontrollsystem verwende, um die vom IDE vorgenommenen Änderungen zum Zeitpunkt des Festschreibens rückgängig zu machen.Wenn ich also eine .dpr-Datei einchecke, überprüfe ich die Unterschiede und stelle die falschen zurück.

Ich versuche auch, Einheiten zum Projekt hinzuzufügen und daraus zu entfernen, indem ich die .dpr-Datei bearbeite, anstatt die IDE dies tun zu lassen.Dies neigt dazu, die Inzidenzrate der gefälschten Mods zu verringern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top