2010-06-21 55 views
3

我想將消息發佈到作爲另一個進程運行的線程(特別是作爲Windows服務)。我已閱讀PostThreadMessage的文檔,但有些事情我不清楚。PostThreadMessage到另一個進程

如何獲得我的服務線程的句柄?

系統僅對系統消息進行編組(即,範圍從0到(WM_USER-1))。要發送其他消息(那些> = WM_USER)到另一個進程,您必須執行自定義編組。

我想發送我自己的消息,那麼我該怎麼做這個編組?

回答

3

PostThreadMessage在這裏並不理想。獲取線程ID確實是個問題,因爲你的服務必須運行多個線程。一個實現服務,另一個抽取讀取消息所需的消息循環。 CreateToolHelp32Snapshot()可以枚舉這些線程,但是您仍然不知道這兩個線程中哪一個是抽取的。

改爲使用命名管道。在您的服務中調用CreateNamedPipe(),使用消息模式併爲管道命名前綴爲「Global \」的名稱,以便它在用戶會話中可見。用戶代碼可以使用衆所周知的管道名稱連接到管道。您可以通過管道發送任何您想要的內容,但是您必須避免使用指針,因爲它們在服務過程中無效。與消息封送處理相同的問題。

其他可能性是一個套接字,非常類似於管道,但使用衆所周知的端口號而不是名稱和進程外COM。如果您需要在整個流程邊界上封送複雜對象,則使用COM是一項優勢。儘管如此,如果你沒有COM技能,就避免它。

+0

我想要做的是找到我的服務和應用程序進行通信的最佳方式,並使此通信對於任何第三方都是最不可見的。我不想去COM方式。命名管道看起來很有趣。 – 2010-06-21 11:38:07

相關問題