1

ユーザーが通常のアプリケーションまたはWindowsサービスとして2つの異なる方法で起動できるアプリケーションがあります。サービスがすでに実行されていて(システムトレイにそのアイコンがあります)、ユーザーがアプリケーションを開始しようとすると(トレイアイコンをクリックして開くだけでなく、[スタート]>[アプリケーション]>[何とか]をクリックして再開します)、 「アプリケーションはすでにサービスとして実行されています。サービスを閉じてアプリを起動しますか?」ユーザーが[はい]をクリックすると、アプリケーションはサービスを閉じて通常のアプリケーションとして起動します。

その場合、ユーザーがサービスを一度停止したことを示すフラグを設定し、アプリケーションを閉じると、ソフトウェアにフラグが表示され、通常のアプリとして開始する前に閉じられたため、サービスの実行を再開する必要があります。

私は入れようとしました:

WinExec(PChar('NET START MyApplicationName'),SW_shownormal);

OnCloseイベントでは、この行の前に:

ExitProcess(0);

しかし、サービスはすでに実行されており、サービスを開始せずにアプリケーションを閉じていると表示されます。その行の後に置くと、何も実行されません。
これを行う方法はありますか?

その前に行を置くExitProcess(0);と、次のメッセージを含むcmdウィンドウが開きます。

「サービスが制御機能に応答していません」

次に、アプリケーションを閉じ、cmdウィンドウを閉じますが、サービスは開始されません。

4

2 に答える 2

7

私の見解では、あなたは問題を過度に複雑にしています。サービスの開始と停止は複雑な操作であり、管理者以外のユーザーはデフォルトで禁止されています。この事実は、あなたのアプリケーションを非常に使いにくいものにします。その使用を管理者ユーザーに制限し、UAC ダイアログを使用することもできます。そのようなアプリを好む人はいません。

別の方法は、サービスを常に実行したままにし、標準のデスクトップ アプリの実行中はサービスを非アクティブにすることです。デスクトップ アプリが起動すると、何らかの形式の IPC を使用してサービスとの通信を開始し、サービスに作業の停止を要求します。サービスがこれを行い、デスクトップ アプリが続行します。デスクトップ アプリが閉じると、サービスは作業を再開するよう求められます。デスクトップ アプリが異常終了しないように、常に通信チャネルを開いたままにしておく必要があります。異常終了した場合、サービスは単純に再起動されます。

ここで、本当に良い仕事をしたいのであれば、仕事のすべての処理を常にサービスで行うことができます。デスクトップ アプリは、サービスのフロント エンドにすぎません。これは、このアプリにとって最も効率的で論理的な設計のように思えます。

于 2012-05-23T13:34:02.063 に答える
0

そのような簡単なバッチファイルを書く

@ECHO OFF
ping 1.1.1.1 -n 1 -w 10000 > NUL
NET START MyApplicationName

次に、プログラムを閉じる前に、このバッチファイルの実行を実行します。

ShellExecute(0, 'Open', YourBatchFile, nil, nil, SW_HIDE)
于 2012-05-23T12:45:41.903 に答える