Windows API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251 ( VS.85).aspxオブジェクトハンドルを複製し、元のプロセスと他のプロセスの両方へのハンドルが必要です。で複製されたハンドルを使用します。
2つのUNRELATEDプロセスがある場合、必要なハンドルが使用可能である限り、どちらかでDuplicateHandle()を呼び出すことができると思いますか?
私の質問は、パイプを使用して2つのプロセス間で通信し、イベントでこれを実現することについてです。
最初のプロセスでは、CreateEvent()を作成します。次に、2番目のプロセスでWaitForSingleObject()を使用します。
最初のプロセスでハンドルを複製しようとすると、最初に2番目のプロセスハンドルをパイプ経由で最初のプロセスに送信し、ハンドルを複製してから、ハンドルを2番目のプロセスに送信する必要がありますか?
または、最初のプロセスハンドルとイベントハンドルを2番目のプロセスに送信し、そこで複製することから始めることもできます。
どちらかを選択する理由はありますか?
しわを追加するために、イベントハンドルは、実際には最初のプロセス(CGIアプリケーション)を呼び出した親プロセスから継承されます。そのイベントハンドルがHANDLE_DO_NOT_DUPLICATE(そのようなもの)で作成された場合、実際にDuplicateHandle()を使用して2番目のプロセスで複製できますか?
応答:
さて、最初のプロセスで新しいNAMEDイベントを作成し、提案されているように2番目のプロセスでそれを見つけることができましたが、最初のプロセスの親で作成されたイベントを複製して、2番目のプロセスに転送しようとしています。このイベントは名前付きイベントではないため、DuplicateHandle()を使用する必要があります。
IPCにパイプを使用しています。イベントハンドルは2番目のプロセスに送信されるときにコンテキスト外であるため、最初のプロセスで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)
2番目のプロセスは、上記の変換で詳述したDuplicateHandle()を使用してハンドルを変換します
hProcPseudo = 4294967295
に
hProcess = 152
次に、このプロセスハンドルを名前付きパイプを介して最初のプロセスに渡します。最初のプロセス(イベントハンドルが有効な場合)では、重複ハンドルを呼び出します。
DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
残念ながら、エラーが発生します。
DuplicateHandle hPipeFCGI GetLastError=6-ハンドルが無効です。
さらにテスト(hFirstProcessを置き換える)すると、無効なのはhSecondProcであることがわかります!??
ビッグミステリー。