11

さまざまな場所からデータをログに記録し、データをファイルに書き込む Delphi アプリがあります。このアプリには、データの表示、オプションの構成などを可能にする非常に広範な GUI があります。

1 人のユーザーが、アプリをサービスとして実行できるように変更するよう要求しました。彼の理由は、アプリは起動時に開始され、ユーザーがログインしていなくても実行でき、誰がログインしているかに関係なく利用できるというものです。

私の質問は次のとおりです。現在存在するアプリをインストールして、ユーザーがログインしていなくても実行でき、すべてのユーザーが利用できるようにする他のソリューションはありますか?

私の直感では、アプリをサービスとして実行するように変換することは簡単ではありません。「ヘッドレス」サービス アプリケーションと、ユーザーがオンデマンドで実行し、サービスとやり取りできる GUI の 2 つのアプリが必要になると思います (ここでもコメントを歓迎します)。

4

6 に答える 6

26

私は通常、コマンドライン スイッチを介して、サービスまたは 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 つ注意しなければならないのは、サービスは通常「システム」ユーザーとして実行されるということです。つまり、さまざまな権限と設定 (ドライブ文字のマッピングなど) を持つことになります。

于 2010-11-05T01:00:48.887 に答える
7

Firedaemonのような商用の (そして無料の) ソリューションがあり、(ほぼ) あらゆるアプリケーションをサービスとして実行します。

余談ですが、ロジックとユーザー インターフェイスを分離するのはそれほど難しいことではありません。アプリケーションを開発したときに、既に分離しているはずです。Delphi では、ユーザー インターフェイスに関連付けられたコード ビハインドにビジネス ロジックを簡単に記述できるからといって、実際にそうすべきだというわけではありません。Martin Fowler のサイトにあるプレゼンテーション パターンを参照してください。

于 2010-11-05T00:37:30.553 に答える
7

一般に、サービスとして実行するか、完全な GUI 標準アプリケーションとして実行する単一の exe を混在させることができます。

アプリケーションがこのカテゴリに適合するために必要な労力は、アプリケーションがどのように設計されているか、特にビジネス ロジックとユーザー インターフェイス ロジックの間の結合の種類にかかっています。

この種のアプリケーションの優れた例の 1 つは、Delphi 自体に付属しています。 $DELPHI\bin ディレクトリにあるscktsrvr.exeは、GUI アプリケーションまたはサービスとして実行されます (scktsrvr.exe /install を実行してサービスを自動登録し、管理コンソールを使用して開始/停止します。

フォルダー $DELPHI\source\db には、プロジェクト ファイル (scktsrvr.dpr/res、ScktCnst.pas、ScktMain.pas/dfm) があります。時間をかけてそれがどのように行われているかを調べてみてください。おそらく、これがあなたのアプリケーションを探しているものでしょう。

Windows Vistaの対話型サービスは、ユーザーのデスクトップで対話することが許可されていないため、考慮してください。管理者は対話型サービスの検出を有効にする必要があり、ユーザーはサービスと対話するためにセッション 0 デスクトップに変更する必要があります (対話とは、サービス フォームを表示して対話することを意味します)。

于 2010-11-05T00:52:48.600 に答える
2

アプリケーションをサービスとして実行するためのツールである svrany の使用を試すことができます。これは、サーバー リソース キット ツールの一部です。 このリンクから 2003 サーバー リソース キットをダウンロードしてみてください

于 2010-11-08T13:19:32.353 に答える
1

アプリケーションを起動する簡単なサービスを作成できます。しかし、あなたがあなたのアプリの将来を気にするなら、私はサービスの道を行くでしょう。はい。特にVistaと7では、セキュリティ上の理由からサービスがユーザーインターフェイスを表示するのがはるかに困難になったため、アプリケーションをクライアント/GUI部分とサービス自体の2つに分割する必要があります。サービスにはいくつかの利点があります。サービスは別々のセッションで実行され、ログオンしたユーザーとは異なる可能性のある特定のユーザーで実行するように設定できます。適切な権限を持つユーザーのみがサービスを制御でき、Windowsはサービス(またはパフォーマンス)を自動的に再起動できます。他のアクション)失敗したとき。

于 2010-11-05T13:26:06.607 に答える
1

アプリケーションによって多少異なりますが、一般的には実現可能です。これを試してください: http://iain.cx/src/nssm。アプリケーションをサービスとして開始する前に、アプリケーションが依存するすべてのサービスを開始することを忘れないでください。その方法については、Google で検索してください。

于 2010-11-05T08:37:47.600 に答える