Jer*_*dge 3 delphi conditional-compilation project-files delphi-xe2
我正在构建一个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.
Run Code Online (Sandbox Code Playgroud)
正如大卫所说,你坚持认为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;
Run Code Online (Sandbox Code Playgroud)
并且您的主应用程序单元将从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.
Run Code Online (Sandbox Code Playgroud)