Frage

Der Windows-API DuplicateHandle () http://msdn.microsoft.com/en-us /library/ms724251(VS.85).aspx Erfordert das Objekt Griff sowohl den ursprünglichen Prozess und den anderen Prozess, den Sie in den duplizierten Griff verwenden mögen dupliziert und mit einem Griff werden.

Ich gehe davon aus, dass, wenn ich zwei voneinander unabhängige Prozesse habe, konnte ich DuplicateHandle () entweder in einem Anruf so lange, wie ich die erforderlichen Handgriffe zur Verfügung hatte?

Meine Frage ist über ein Rohr mit zwischen den beiden Prozessen kommunizieren dies mit einem Ereignisse zu erreichen.

Im ersten Prozess I Create (). Jetzt möchte ich WaitForSingleObject () im zweiten Prozess verwenden.

Wenn ich versuche, den Griff in dem ersten Prozess zu duplizieren, muß ich zuerst die zweite Prozesshandle zu dem ersten Prozess über die Leitung senden, duplizieren den Griff und dann senden die über das zweite Verfahren behandeln?

Alternativly, kann ich beginnen mit dem ersten Prozess handelte Senden und das Ereignis an den zweiten Prozess behandeln und nur dort duplizieren.

Gibt es einen Grund, warum ich einen über die andere wählen soll?

eine Falte hinzuzufügen, wird das Ereignis Handle tatsächlich aus dem übergeordneten Prozess geerbt, die tatsächlich der erste Prozess genannt (das ist eine CGI-Anwendung ist). Wenn das Ereignis Griff mit HANDLE_DO_NOT_DUPLICATE (so ähnlich) erstellt wurde, dann kann ich in der Tat verwenden DuplicateHandle () es für den zweiten Prozess zu duplizieren?

Antwort:

Nun, ich könnte ein neues benanntes Ereignis in dem ersten Prozess erstellen und in dem zweiten Prozess finden, wie vorgeschlagen, aber ich versuche, um das Ereignis zu duplizieren, die in den übergeordneten des ersten Prozess und foreward es mit dem zweiten Prozess erstellt wurden . Dieses Ereignis wird ein Ereignis nicht genannt, so das ich verwende DuplicateHandle müssen ().

Ich bin mit einem Rohr für den IPC. Ich bin bewusst, dass DuplicateHandle () muss im ersten Prozess aufgerufen werden, da das Ereignis handelte aus dem Zusammenhang gerissen ist, wenn auf den zweiten Prozess gesendet.

        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 Umwandeln

hProcPseudo = 4294967295

hProcess = 152

Dann gehe ich diesen Prozess Handle zu dem ersten 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)

Leider bekomme ich den Fehler:

DuplicateHandle hPipeFCGI GetLastError = 6 - Der Griff ist ungültig.

Weitere Tests (Substitution hFirstProcess) zeigt es hSecondProc ist, die ungültig ist! ??

Big Geheimnis.

War es hilfreich?

Lösung

Verwenden Sie einen Named Pipe oder < a href = "http://msdn.microsoft.com/en-us/library/aa365576(VS.85).aspx" rel = "nofollow noreferrer"> Mailslots für IPC , sollte diese zuverlässig arbeiten für Ihre Zweck. Wenn Sie warten müssen, verwenden Sie benannte Wartegriffe.

Ansonsten würde ich wählen DuplicateHandle im zweiten Prozess zu tun, um den Griff Eigentum richtig zu setzen.

Andere Tipps

Prozesspunkt unterscheidet sich von der Prozess-ID. Open nimmt Prozess-ID. Verwenden Sie so etwas wie ...

GRIFF hProcess = Open (PROCESS_DUP_HANDLE, FALSCH, GetCurrentProcessId ());

Wenn ich richtig verstanden habe, wollen Sie zwei voneinander unabhängige Prozesse durch das gleiche Ereignis synchronisieren. Wenn ja, können Sie benannte Ereignisse verwenden.

Erstellen Sie eine mit Create API-Funktion stellen sie einen Namen, dann aus dem zweiten Prozess Verwendung Openevent API-Funktion, den Namen des Ereignisses angeben.

Sie haben ähnliche Funktionen für andere Synchronisierungsobjekte wie Mutexe ( OpenMutex ) oder Semaphore ( OpenSemaphore ) .

scroll top