2014-02-10 56 views
1

使用的Win32 C++ API,我想已知IPC method,允許在多進程通信的任何端點,得到該進程的PID或HANDLE它正在與之通信。換句話說,如果進程A從進程B得到消息:如何獲得在進程間通信另一端點的進程id

  • 可以知道B發送了消息,沒有B(直接)在發送的消息內給出任何提示嗎?怎麼樣?
  • 需要量:B的 PID不能將IPC消息內被髮送到。

通信的目的是一個簡單的遠程過程調用。但是,我不希望遠程系統/主機上的進程調用在本地主機上運行的進程提供的過程。

當然我找到了RPC documentation on MSDN。但是,我想知道是否有比RPC更好的方式來實現我想要的。或者,如果您認爲RPC是要走的路,請告訴我爲什麼以及如果您知道任何其他從MSDN以外學習的好參考?

+0

它有什麼用?如果端點在另一臺計算機上,它根本不會幫助你。另外,「句柄」只在同一個進程中有效......通常你可以通過將RPC綁定到「127.0.0.1」來解決這個問題...... –

+0

我想通過'OpenProcess' API的返回值獲得HANDLE的同樣方法來獲得另一個進程的HANDLE。這個問題是基於可能有另一個函數返回HANDLE而不需要PID,例如,簡單地基於IPC消息。 – Benny

+0

正如我所說:手柄是特定的過程!你不能使用不同進程的句柄做任何事情... –

回答

1

如果您實施自己的RPC與Named Pipes,您將能夠從服務器進程使用GetNamedPipeClientProcessId獲取本地端點客戶端進程的PID。

編輯:如果你確實是在安全後,第一條規則是「你不應該寫你自己的系統」。

+0

這可能是一個有關該問題的答案,但是:如果存在安全問題,應該用安全限制解決,而不是與PID相關......世衛組織應該知道哪些PID有效?如果有特別的特權或用戶,那麼毫無疑問... –

+0

@JochenKalmbach我知道。只是回答這個問題。但是,將編輯。 – manuell

+1

還有一個相應的['GetNamedPipeServerProcessId()'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365446.aspx)函數。 –

1

我'不熟悉的所有方法,

WM_COPYDATA方法,您有:

wParam 
    A handle to the window passing the data. 

這樣你就可以使用它GetWindowThreadProcessID,但WM_COPYDATA是使用單臺PC

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011%28v=vs.85%29.aspx

要確定誰打開給手柄你將不得不使用一些低級別技巧,像SysInternals的handle.exe程序那樣(http://forum.sysinternals.com/topic18892.html)。

+0

我沒有明確地提到它,但我使用的過程沒有窗口。因此,我想我不能在我的情況下使用'GetWindowThreadProcessID'。至於你關於句柄枚舉的其他建議,恐怕一個進程可能會釋放句柄給一些共享資源,比如文件,在它「發送」消息之後。此外,我想知道發送消息的進程的ID,並且在共享資源的情況下,您可能有超過2個進程在同一資源上擁有句柄,對吧? – Benny

+0

如果您正在進行兩個進程之間的通信,那麼在此通信中包含第三個進程將是錯誤的。這看起來像你允許使用同名的文件從任何其他應用程序與你的應用程序進行通信。如果你使用IPC的共享內存,那麼你將不得不給它一些你的應用程序和第二個應用程序知道的名字。 – marcinj

+0

.... IPC通常從一些握手開始,這是進程交換有關如何進行通信的信息的時刻,這可能包括文件/句柄的名稱。由於這一點,我真的沒有看到任何理由檢查遠程應用程序的PID,因爲它可以很容易地使用您的協議提供。 – marcinj

3

如果你想限制RPC只對本地計算機上,那麼你應該綁定您的RPC系統爲「127.0.0.1」。那麼只有本地進程才能與此端口通信!