2010-06-02 156 views
4

我們正在嘗試開發一種將消息發送到服務的應用程序,但我們只在兩個應用程序之間發送消息。我們正在開發Delphi 7,Windows XP。如何發送消息給服務?

我們需要該服務嚮應用程序發回消息,具體取決於應用程序發送到服務的操作結果。

那麼,有人說,從應用程序發送消息到服務是不可能的。因此,我們決定提供兩項服務,現在我們必須將消息從一項服務發送到另一項服務。現在,重點是:如何從服務向另一個服務發送消息?

回答

13

您無法將窗口消息發送到服務。首先,服務沒有自己的UI,更不用說Windows了。其次,即使將自己的隱藏窗口添加到服務中(實際上,基於Delphi的服務確實具有隱藏的TApplication窗口),也不允許窗口消息通過會話邊界(服務在與用戶模式不同的會話中運行應用程序)。

有許多IPC(進程間通信)機制與服務(命名管道,郵件槽,TCP/IP和UDP套接字)一起使用,僅舉幾例。您將不得不使用其中之一。

+0

對不起,但它是錯誤的。您可以將窗口消息發送到服務。只需在創建服務時設置適當的參數。然後你創建你自己的消息處理程序。而在本地,使用WM_COPYDATA的GDI消息比任何其他IPC機制都快(至少如果你的消息是KB)。要將消息發送迴應用程序,只需使用PostMessage或SendMessage呼叫到客戶端HWND實例(已使用第一條消息發送)。請參閱http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas和TSQLRestClientURIMessage + TSQLRestServer.ExportServerMessage – 2011-02-20 09:35:27

+1

@ A.Bouchez:您指的是什麼創建參數? 'SERVICE_INTERACTIVE_PROCESS'?從Vista開始,不再支持該標誌。窗口消息不能通過會話邊界(在任何Windows版本中)。服務可以與外部應用程序交換窗口消息的唯一方式是該應用程序與服務在同一個會話中運行。服務不要與XP和更早版本中的大多數登錄用戶以及Vista和更高版本中的NO用戶在同一會話中運行。 – 2011-02-22 08:31:31

7

我建議命名管道。有人已經提供了great example in Delphi(這個網站上也有其他例子)

+0

用於引導到比你的另一個答案+1 ... :) – 2010-06-03 00:13:31

0

我使用Indy TCP服務器和我的服務,然後我可以從同一臺機器或其他機器進行通信。這是一個很好的補充。我來回發送記錄,記錄的開頭告訴服務器什麼類型的消息以及緩衝區包含什麼,反之亦然。

Richard