Der Windows-API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx den Objektgriff erfordert sowohl den ursprünglichen Prozess und den anderen Prozess, den Sie in den duplizierten Griff verwenden mögen dupliziert und einen Griff werden.DuplicateHandle(), im ersten oder zweiten Prozess verwenden?
Ich gehe davon aus, dass, wenn ich habe zwei UNRELATED-Prozesse, könnte ich DuplicateHandle() in beiden aufrufen, solange ich die benötigten Handles zur Verfügung hatte?
Meine Frage bezieht sich auf die Verwendung einer Pipe für die Kommunikation zwischen den beiden Prozessen, um dies mit einem Event zu erreichen.
Im ersten Prozess CreateEvent(). Jetzt möchte ich WaitForSingleObject() im zweiten Prozess verwenden.
Wenn ich versuche, das Handle im ersten Prozess zu duplizieren, muss ich zuerst das zweite Prozess-Handle an den ersten Prozess über die Pipe senden, das Handle duplizieren und dann den Handle an den zweiten Prozess übergeben?
Alternativ könnte ich beginnen, indem Sie das erste Prozess-Handle und das Event-Handle an den zweiten Prozess senden und es dort einfach duplizieren.
Gibt es einen Grund, warum ich einen über den anderen wählen sollte?
Zum Hinzufügen eines Knicks wird das Ereignis-Handle tatsächlich vom übergeordneten Prozess geerbt, der den ersten Prozess (der eine CGI-Anwendung ist) aufgerufen hat. Wenn dieses Event-Handle mit HANDLE_DO_NOT_DUPLICATE (so etwas) erstellt wurde, kann ich dann DuplicateHandle() verwenden, um es für den zweiten Prozess zu duplizieren?
Antwort:
Nun, ich ein neues benanntes Ereignis in dem ersten Prozess schaffen könnte und in dem zweiten Prozess finden, wie vorgeschlagen, aber ich versuche, um das Ereignis zu duplizieren, die in den übergeordneten des ersten Prozess erstellt wurden und weiter zum zweiten Prozess. Dieses Ereignis ist kein benanntes Ereignis, daher muss ich DuplicateHandle() verwenden.
Ich verwende eine Leitung für den IPC. Ich bin mir bewusst, dass DuplicateHandle() im ersten Prozess aufgerufen werden muss, da das Event-Handle außerhalb des Kontextes ist, wenn es an den zweiten Prozess gesendet wird.
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)
Der zweite Prozess wandelt seinen Griff mit DuplicateHandle() Ausführliches oben Umwandlung
hProcPseudo = 4294967295
zu
hProcess = 152
Dann gebe ich diesen Prozess Handle der erste Prozess über die Named Pipe. In dem ersten Verfahren (in dem das Ereignis Handle gültig ist) nenne ich doppelte Griff:
DuplicateHandle(hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
Unfortunatly bekomme ich den Fehler:
DuplicateHandle hPipeFCGI GetLastError = 6 - Der Griff ist ungültig.
Weitere Tests (Substitution von hFirstProcess) zeigt, dass es hSecondProc ungültig ist!
Großes Geheimnis.
Ich kenne Ihr Layout nicht, aber möchten Sie ein benanntes Ereignis verwenden? Das könnte einfacher sein, als zu versuchen, das Handle zu duplizieren. –