Я создаю приложение для Windows, которое имеет конфигурацию для его компиляции в качестве основного приложения Windows. Основной файл проекта для exe включает в себя условные выражения, которые определяют, скомпилирован ли проект в качестве приложения-службы или как приложение форм Windows.Использование условных выражений в основном блоке проекта - IDE уничтожает код
Проблема в том, что когда я делаю что-то, что меняет код проекта, код разрушается и прерывается. Например, строка, которая указывает 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.
Хотя я думаю, что знаю, в чем ваш вопрос, я не вижу нигде, где вы прямо задаете вопрос. –
Немного странно, что вы переключаетесь между сервисом и графическим интерфейсом с условным. Переключение между сервисом и скрытым стандартным приложением будет иметь больше смысла. И в этом случае коммутатор будет лучше в качестве аргумента командной строки. Является ли приложение GUI интерфейсом к вашему сервису? Если это так, то отдельный проект будет казаться более естественным. –
Существует как форма VCL, так и модуль служебных данных. В зависимости от конфигурации сборки (у меня есть 3) одна конфигурация объявит «TestApp», где я могу, в свою очередь, использовать условные выражения, чтобы определить, следует ли ее компилировать как службу или приложение VCL. Они не используют друг друга вообще. 'TJDRMSvr' - это модуль служебных данных, а' TJDRMSvrTest' - это форма приложения. Приложение разработано с некоторыми возможностями запуска/остановки и ведения журнала, поэтому я могу просматривать журналы в режиме реального времени, а не открывать/обновлять файл журнала, и я могу начать/остановить рабочий поток (отдельный) по мере необходимости. –