전역 인터페이스 테이블을 사용해야 하는 경우

프로세스에서 아파트 간에 인터페이스 포인터를 여러 번 구분 해제하는 경우 IGlobalInterfaceTable 인터페이스를 사용할 수 있습니다. 다른 기술을 사용하면 매번 다시마샬해야 합니다.

참고

인터페이스 포인터가 한 번만 숨기지 않으면 CoMarshalInterThreadInterfaceInStream 함수를 사용할 수 있습니다. 또한 동일한 프로세스에서 한 스레드에서 다른 스레드로 인터페이스 포인터를 전달하는 데 사용할 수도 있습니다.

 

또한 IGlobalInterfaceTable 인터페이스를 사용하면 프로그래머가 이전에 어려웠던 또 다른 문제를 더 간단하게 만들 수 있습니다. 이 문제는 다음 조건이 적용될 때 발생합니다.

  • In-Process Agile 개체는 자유 스레드 마샬러를 집계합니다.
  • 이 동일한 Agile 개체는 민첩하지 않고 자유 스레드 마샬러를 집계하지 않는 다른 개체에 대한 인터페이스 포인터를 멤버 변수로 보유합니다.

이 경우 외부 개체가 다른 아파트로 마샬링되고 애플리케이션이 호출하고 개체가 자유 스레드가 아니거나 다른 아파트의 개체에 프록시인 멤버 변수 인터페이스 포인터를 호출하려고 하면 잘못된 결과 또는 오류 RPC_E_WRONG_THREAD 발생할 수 있습니다. 이 오류는 내부 인터페이스가 멤버 변수에 처음 저장된 아파트에서만 호출할 수 있도록 설계되었기 때문에 발생합니다.

이 문제를 해결하려면 자유 스레드 마샬러를 집계하는 외부 개체는 내부 인터페이스에서 IGlobalInterfaceTable::RegisterInterfaceInGlobal 을 호출하고 실제 인터페이스 포인터를 저장하는 대신 결과 쿠키를 멤버 변수에 저장해야 합니다. 외부 개체가 내부 개체의 인터페이스 포인터에서 를 호출하려는 경우 IGlobalInterfaceTable::GetInterfaceFromGlobal을 호출하고 반환된 인터페이스 포인터를 사용한 다음 해제해야 합니다. 외부 개체가 사라지면 IGlobalInterfaceTable::RevokeInterfaceFromGlobal 을 호출하여 전역 인터페이스 테이블에서 인터페이스를 제거해야 합니다.

전역 인터페이스 테이블 만들기