3

我正在构建一个 Windows 服务应用程序,该应用程序具有将其编译为基本 Windows 应用程序的配置。exe 的主项目文件包括确定项目是作为服务应用程序还是作为 Windows 窗体应用程序编译的条件。

问题是,当我做一些改变项目代码的事情时,代码会被破坏和破坏。例如,说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

正如大卫所说,你被 IDE 困住了,认为 dpr 是它自己的私人后院。最简单的解决方案是将所有内容放在一个单独的单元中,并从 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 文件时,我都会查看差异并还原虚假文件。

我还尝试通过编辑 .dpr 文件而不是让 IDE 来在项目中添加和删除单元。这往往会降低假模组的发生率。

于 2012-02-17T18:58:15.377 回答