簡體   English   中英

應用程序在Delphi中關閉后如何啟動自己的服務?

[英]How an application can start its own service after it closes in Delphi?

我有一個應用程序,用戶可以用兩種不同的方式啟動它,作為普通應用程序或Windows服務。 當該服務已經運行時(系統托盤中有一個圖標),並且用戶嘗試啟動該應用程序(不僅通過單擊托盤圖標打開,還再次單擊開始>應用程序> Blah blah開始)。說:“ 該應用程序已經作為服務運行,您要關閉該服務並啟動該應用程序嗎? ”當用戶單擊“是”時,該應用程序將關閉該服務並以普通應用程序的身份啟動。

發生這種情況時,我會放置一個標志,指示用戶曾經停止了該服務,並且當他們關閉該應用程序時,軟件會看到該標志,並且該服務必須重新開始運行,因為該服務在作為普通應用程序啟動之前已關閉。

我試圖把:

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

OnClose事件中,在此行之前:

ExitProcess(0);

但是它說該服務已經在運行,並且在不啟動該服務的情況下關閉了該應用程序,如果我將其放在該行之后,它什么也沒做。
有什么辦法嗎?

當我將代碼放在ExitProcess(0); 它打開一個帶有消息的cmd窗口:

“服務未響應控制功能”

然后關閉應用程序,關閉cmd窗口,並且不啟動服務。

在我看來,您使問題變得更加復雜。 啟動和停止服務是一項復雜的操作,實際上,默認情況下,非管理員用戶禁止使用該服務。 這個事實將使您的應用程序非常煩人。 您將其使用限制為管理員用戶,並且還可以使用UAC對話框來限制他們。 沒有人喜歡這樣的應用程序。

另一種方法是簡單地使您的服務一直運行,而在標准桌面應用程序運行時使其不活動。 桌面應用程序啟動時,它將使用某種形式的IPC與服務建立通信,並要求服務停止工作。 該服務執行此操作,然后桌面應用繼續。 桌面應用程序關閉時,要求該服務恢復工作。 您可能希望始終保持一個開放的通信通道,以防止桌面應用程序異常終止-如果發生這種情況,該服務將僅重新啟動。

現在,如果您真的想做好工作,則可以讓所有工作處理始終在服務中進行。 桌面應用程序僅僅是該服務的前端。 在我看來,這似乎是此應用程序最有效,最合邏輯的設計。

像這樣寫一個簡單的批處理文件

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

然后在關閉程序之前運行執行此批處理文件。

ShellExecute(0, 'Open', YourBatchFile, nil, nil, SW_HIDE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM