3

基本的なWindowsアプリケーションとしてコンパイルするための構成を持つWindowsサービスアプリケーションを構築しています。exe のメイン プロジェクト ファイルには、プロジェクトをサービス アプリケーションとしてコンパイルするか、Windows フォーム アプリケーションとしてコンパイルするかを決定する条件が含まれています。

問題は、プロジェクト コードを変更するようなことをすると、コードが破壊されて壊れてしまうことです。たとえば、becksという行と has という行がApplication.Initialize;に切り詰められ、ほとんどの条件文が削除されます。AppliApplication.Initialize;{$R *.RES}S}

この問題を克服する方法があるかどうか、トリックがあるかどうか、またはニヤニヤして耐える必要があるかどうか疑問に思っています。

残しておきたいので、以下にファイルを示します...

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.
4

3 に答える 3

5

David が言うように、あなたは dpr がそれ自身のプライベートな裏庭であると信じている IDE に固執しています。最も簡単な解決策は、すべてを別のユニットにまとめ、dpr の uses 句から条件を削除することです。いずれにせよ、FastMM はサービス バージョンとテスト アプリで役立ちます。vcl.forms と vcl.svcMgr の区別は、その別のユニットで行うことができます。

dpr は次のように削減されます。

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;

メイン アプリケーション ユニットは、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.
于 2012-02-17T19:42:54.113 に答える
3

簡単な答えは、別のプロジェクトを作成し、それをスタンドアロン バージョンとして使用することです。これは私がサービスで行っていることであり、各モードに合わせて他の条件を使用できることを意味します。

于 2012-02-17T20:04:22.817 に答える
2

はい、IDEはそれを実行し、常に実行しています。そのような振る舞いを止める方法は知られていない。あなたはただそれを吸わなければならないだろう。

私は同様の条件を持っており、それらに対処する方法は、リビジョン管理システムを使用して、コミット時にIDEが行った変更を元に戻すのを支援することです。したがって、.dprファイルをチェックインするたびに、違いを確認し、偽のファイルを元に戻します。

また、IDEに任せるのではなく、.dprファイルを編集して、プロジェクトにユニットを追加したり、プロジェクトからユニットを削除したりしようとしています。これにより、偽のmodの発生率が低下する傾向があります。

于 2012-02-17T18:58:15.377 に答える