2009-05-04 23 views
3

在Windows API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx 需要被複制對象的句柄和手柄無論是原工藝和其他工藝要使用複製的手柄英寸DuplicateHandle(),用於第一個還是第二個進程?

我假設,如果我有兩個UNRELATED進程,只要我有可用的句柄,我可以在任何一箇中調用DuplicateHandle()。

我的問題是關於使用管道兩個進程之間的通信與一個事件來實現這一目標。

在第一個過程中我CreateEvent()。現在我想在第二個進程中使用WaitForSingleObject()。

如果我試圖複製在第一工藝的處理,我需要先通過管道第二進程句柄發送到第一過程中,重複的手柄,然後送過來的句柄第二個過程?

Alternativly,我可以通過發送第一進程句柄和事件句柄到第二進程的開始,只是複製它。

是否有一個原因,我應該選擇一個比其他?

要添加皺紋,事件句柄實際上是從實際稱爲第一過程(這是一個CGI應用程序)父進程繼承。如果該事件句柄是用HANDLE_DO_NOT_DUPLICATE(類似的)創建的,那麼我可以使用DuplicateHandle()爲第二個過程複製它嗎?

響應:

嗯,我可以創建在第一過程中一個新的命名事件,並發現它在第二過程的建議,但我想複製這是在第一個進程的父窗口創建活動並將其推向第二個過程。這個事件不是一個命名事件,所以我需要使用DuplicateHandle()。

我正在使用IPC的管道。我意識到必須在第一個進程中調用DuplicateHandle(),因爲事件句柄在發送到第二個進程時不在上下文中。

 hProcPseudo = GetCurrentProcess() 

    //Then call either: 
     lpRealHandle = OpenProcess(PROCESS_DUP_HANDLE, 0, hProcPseudo) 
//This fails with GetLastError= 87 - The parameter is incorrect ??? 
// same thing with PROCESS_ALL_ACCESS ?? 


    //OR 
     lRet = DuplicateHandle(hProcPseudo, hProcPseudo, hProcPseudo, lpRealHandle, DUPLICATE_SAME_ACCESS, 0, 0) 

    //then I can Duplicate my Event Handle in the first thread with: 
     lRet = DuplicateHandle(hLocalProcess, hEvent, lpRealHandle, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0) 

第二處理轉換及其與DuplicateHandle()手柄上述轉換詳述

hProcPseudo = 4294967295

hProcess = 152

然後我此過程句柄傳遞給第一個過程通過命名管道。 在第一種方法(其中事件句柄是有效的),我稱之爲重複手柄:

DuplicateHandle(hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0) 

不幸的是我得到的錯誤:

DuplicateHandle hPipeFCGI GetLastError函數= 6 - 句柄無效。

進一步測試(代hFirstProcess)表明它是hSecondProc是無效的!??

大神祕。

+1

我不知道你的佈局,但你想考慮使用命名事件嗎?這可能比試圖複製句柄更容易。 – 2009-05-04 11:31:42

回答

1

使用named pipemailslots爲IPC,這應該可靠地爲您的目的工作。如果您需要等待,請使用命名的等待手柄。

否則,我會選擇在第二個進程中執行DuplicateHandle以正確設置句柄所有權。

1

如果我理解正確,您希望通過相同的事件同步兩個不相關的進程。如果是這樣,你可以使用命名事件。

使用CreateEvent創建一個API函數,爲其提供一個名稱,然後從第二個進程使用OpenEvent API函數,指定事件的名稱。

對於其他同步對象(例如互斥鎖(OpenMutex)或信號量(OpenSemaphore)),您有類似的功能。

+0

見上文。 我看到GetCurrentProcess()的相同值 - 用於DuplicateHandle() - 在這兩個進程中。那看起來不正確?爲什麼是這樣? – 2009-05-05 08:29:15

+0

你試圖用DuplicateHandle複製什麼樣的句柄? AFAIK,創建句柄的過程(使用CreateXXXX函數)是該創建對象的所有者。 – 2009-05-05 10:48:01

1
  1. 不知何故,第二個進程需要獲得它的進程ID到第一個進程。這可以通過「GetProcessId(GetCurrentProcess());」
  2. 第一個進程現在需要使用此ID來獲得第二個進程的句柄:「hProcess = OpenProcess(PROCESS_DUP_HANDLE,FALSE,dwProcessId);」
  3. 現在您可以使用第二個進程的REAL進程句柄和第一個進程的僞句柄複製第一個進程中的句柄:「DuplicateHandle(GetCurrentProcess(),hEvent,hProcess,& hDupEvent,0,FALSE ,DUPLICATE_SAME_ACCESS);「
  4. 記得最終釋放你用「OpenProcess」創建的句柄(我不知道它會產生什麼差別,但你應該......)。另外,釋放BOTH處理事件:給予第二個進程和初始句柄的那個。
0

進程句柄與進程ID不同。 OpenProcess需要進程ID。使用類似...

HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE,FALSE,GetCurrentProcessId());

相關問題