私は通常、コマンドライン スイッチを介して、サービスまたは GUI として起動できるようにアプリケーションを作成します/GUI
。
アプリケーションが GUI で実行される場合、サービス クラスを「手動で」インスタンス化して開始します。
利点:
同じコードが実行されるため、サービスのデバッグが非常に簡単になります。実行中のアプリケーションに「アタッチ」しなくても、ブレークポイントを設定してコードをステップ実行できます。
GUI のおかげで、デバッガーを持っていないリモート サーバーでも、リストビューとボタンを介して、サービスが何をしているかを確認し、対話することができます。ログと構成を介してサービスと対話する必要があるのは、面倒で時間がかかります。
次のように機能するプロジェクトの dpr の例:
program xxxx;
uses
SysUtils,
SvcMgr,
.......;
{$R *.res}
begin
GlobalAppId := 1;
MapMatcherController := TMapMatcherController.Create(nil);
try
if FindCmdLineSwitch('GUI',['/','-'],True) then
begin
Forms.Application.Initialize;
Forms.Application.MainFormOnTaskbar := True;
Forms.Application.CreateForm(TfrmMain, frmMain);
Forms.Application.Run;
end
else
begin
SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TsrvMapMatcher2, srvMapMatcher2);
SvcMgr.Application.Run;
end;
finally
MapMatcherController.Free;
end;
end.
ああ、もう 1 つ注意しなければならないのは、サービスは通常「システム」ユーザーとして実行されるということです。つまり、さまざまな権限と設定 (ドライブ文字のマッピングなど) を持つことになります。