在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是無效的!??
大神祕。
我不知道你的佈局,但你想考慮使用命名事件嗎?這可能比試圖複製句柄更容易。 – 2009-05-04 11:31:42