Duplicathandle (), 첫 번째 또는 두 번째 프로세스에서 사용하십니까?

StackOverflow https://stackoverflow.com/questions/819710

  •  03-07-2019
  •  | 
  •  

문제

Windows API DuplicAndle ()http://msdn.microsoft.com/en-us/library/ms724251(vs.85).aspx객체 핸들을 복제해야하고 복제 된 핸들을 사용하려는 원래 프로세스와 다른 프로세스를 모두 처리해야합니다.

두 개의 관련이없는 프로세스가 있으면 필요한 핸들이있는 한 두 가지 프로세스를 사용하여 DuplyHandle ()을 호출 할 수 있다고 가정합니다.

내 질문은 파이프를 사용하여 두 프로세스간에 통신하여 이벤트로이를 달성하는 것입니다.

첫 번째 과정에서 나는 createevent (). 이제 두 번째 프로세스에서 WaitforsingleObject ()를 사용하고 싶습니다.

첫 번째 프로세스에서 핸들을 복제하려고하면 먼저 파이프를 통해 두 번째 프로세스 핸들을 첫 번째 프로세스로 보내고 핸들을 복제 한 다음 핸들을 두 번째 프로세스로 보내야합니까?

대안으로, 첫 번째 프로세스 핸들과 이벤트 핸들을 두 번째 프로세스로 보내고 그곳에서 복제하는 것으로 시작할 수 있습니다.

내가 하나를 선택 해야하는 이유가 있습니까?

주름을 추가하기 위해, 이벤트 핸들은 실제로 첫 번째 프로세스 (CGI 응용 프로그램)라고 불리는 상위 프로세스에서 상속됩니다. 해당 이벤트 핸들이 hands_do_not_duplice (이와 비슷한 것)로 생성 된 경우 실제로 DuplyHandle ()을 사용하여 두 번째 프로세스를 위해 복제 할 수 있습니까?

응답:

글쎄, 나는 첫 번째 프로세스에서 새로운 지명 된 이벤트를 만들어 제안 된대로 두 번째 프로세스에서 찾을 수 있지만, 첫 번째 프로세스의 부모에서 생성 된 이벤트를 복제하고 두 번째 프로세스로 돌려 받으려고 노력하고 있습니다. 이 이벤트는 명명 된 이벤트가 아니므로 duplicathandle ()을 사용해야합니다.

IPC에 파이프를 사용하고 있습니다. 이벤트 핸들이 두 번째 프로세스로 전송 될 때 컨텍스트를 벗어난 것이기 때문에 첫 번째 프로세스에서 DuplicAndle ()가 호출되어야한다는 것을 알고 있습니다.

        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)

두 번째 프로세스는 핸들을 위의 DuplyHandle ()로 위의 상장으로 변환합니다.

hprocpseudo = 4294967295

에게

hprocess = 152

그런 다음이 프로세스 핸들을 명명 된 파이프를 통해 첫 번째 프로세스로 전달합니다. 첫 번째 프로세스 (이벤트 핸들이 유효한 경우)에서 중복 핸들을 호출합니다.

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

불행히도 오류가 발생합니다.

Duplicathandle HPIPEFCGI getLasterror = 6- 핸들이 유효하지 않습니다.

추가 테스트 (HFIRSTPROCESS 대체)는 유효하지 않은 HSECONDPROC임을 보여줍니다! ??

큰 미스터리.

도움이 되었습니까?

해결책

a 명명 된 파이프 또는 메일 슬롯 IPC의 경우 이것은 귀하의 목적을 위해 안정적으로 작동해야합니다. 기다려야하는 경우 대기 손잡이를 사용하십시오.

그렇지 않으면, 핸들 소유권을 올바르게 설정하기 위해 두 번째 프로세스에서 DuplicathHandle을 수행하도록 선택했습니다.

다른 팁

프로세스 핸들은 프로세스 ID와 다릅니다. OpenProcess는 프로세스 ID를 가져옵니다. ...와 같은 것을 사용하십시오.

hprocess hprocess = OpenProcess (process_dup_handle, false, getCurrentProcessId ());

내가 올바르게 이해하면 동일한 이벤트를 통해 관련없는 두 프로세스를 동기화하려고합니다. 그렇다면 명명 된 이벤트를 사용할 수 있습니다.

사용 중 하나를 만듭니다 Createevent API 함수, 이름을 제공 한 다음 두 번째 프로세스 사용에서 Openevent API 함수, 이벤트 이름을 지정합니다.

Mutxes와 같은 다른 동기화 객체에 대해 유사한 기능이 있습니다.OpenMutex) 또는 세마포어 (OpenSemaphore).

  1. 어떻게 든 두 번째 프로세스는 프로세스 ID를 첫 번째 프로세스로 가져와야합니다. 이것은 얻을 수 있습니다 GetCurrentProcessId()
  2. 첫 번째 프로세스는 이제이 ID를 사용하여 HANDLE 두 번째 과정에 : hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
  3. 이제 두 번째 프로세스의 실제 프로세스 핸들과 첫 번째 프로세스의 의사 핸들을 사용하여 첫 번째 프로세스에서 핸들을 복제 할 수 있습니다. DuplicateHandle(GetCurrentProcess(), hEvent, hProcess, &hDupEvent, 0, FALSE, DUPLICATE_SAME_ACCESS);
  4. 만든 핸들을 해제해야합니다 OpenProcess 결국 (나는 그것이 어떤 차이를 만들지 모르겠지만, 당신은해야 할 것입니다 ...). 또한 두 핸들을 이벤트에 릴리스합니다. 두 번째 프로세스와 초기 핸들에 주어진 것.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top