다음을 통해 공유


In-Context 후크 함수 예방 조치

성능상의 이유로 클라이언트 개발자는 컨텍스트 내 후크 함수를 등록합니다. 그러나 이러한 후크 함수는 서버의 주소 공간에 매핑되므로 클라이언트 및 서버 개발자는 이벤트 처리가 원활하게 진행되도록 주의해야 합니다.

클라이언트 개발자를 위한 예방 조치

클라이언트 개발자는 다음 문제를 알고 있어야 합니다.

  • 후크 함수는 서버 애플리케이션이 계속되기 전에 반환해야 하므로 컨텍스트 내 후크 함수는 프로세서 시간을 많이 사용하지 않아야 합니다.
  • 이벤트가 트리거되면 후크 함수가 호출될 때까지 이벤트와 연결된 창이 더 이상 존재하지 않을 수 있습니다. 클라이언트는 이벤트와 관련된 다른 작업을 수행하기 전에 이벤트와 연결된 창이 여전히 존재하는지 확인해야 합니다. 창이 계속 존재하는지 확인하기 위해 클라이언트는 Microsoft Win32 IsWindow 함수를 사용합니다.
  • 후크 함수가 정의된 DLL이 다른 DLL에 연결되는 경우 클라이언트 개발자는 시스템이 다른 DLL을 로드하는지 확인해야 합니다. .def 파일 및 가져오기를 사용하여 암시적으로 연결하는 경우 추가 DLL은 Windows 디렉터리 또는 Windows\System, Windows\System32 또는 Windows\SysWOW64와 같은 시스템 디렉터리 중 하나에 있어야 합니다. LoadLibrary를 사용하여 명시적으로 연결하는 경우 LoadLibrary 호출에서 추가 DLL이 상주하는 디렉터리의 전체 경로를 지정해야 합니다.
  • 컨텍스트 내 후크 함수는 후크 함수를 포함하는 DLL이 16비트 애플리케이션에 로드될 때 스택 오버플로를 일으킬 수 있습니다. 이 문제는 16비트 애플리케이션이 후크 함수를 호출하는 시스템 함수 호출 체인을 수용할 만큼 크지 않은 고정 스택 크기를 사용하기 때문에 발생합니다.

서버 개발자를 위한 예방 조치

서버 개발자는 클라이언트 애플리케이션이 컨텍스트 내 후크 함수를 등록할 수 있음을 알고 있어야 합니다. 서버가 NotifyWinEvent를 호출하는 경우 WM_GETOBJECT 및 기타 IAccessible 메서드를 처리할 준비가 되어 있어야 합니다.

잘못된 인터페이스 포인터

클라이언트가 컨텍스트 내 후크 함수 내에서 AccessibleObjectFromEvent 를 호출할 때 반환되는 IAccessible 인터페이스 포인터는 서버의 주소 공간에 있는 코드에 직접 연결됩니다. 클라이언트가 이 포인터를 사용하여 인터페이스 속성을 호출하는 경우 COM(구성 요소 개체 모델) 라이브러리는 마샬링(프로세스 경계를 넘어 인터페이스 매개 변수 패키징 및 보내기) 또는 경계 해제(프로세스 경계를 넘어 전송된 매개 변수 패키징 해제)와 관련이 없으며 개체가 제거되었는지 여부를 검색하지 않습니다.

클라이언트가 소멸된 개체에 인터페이스 속성을 호출하는 경우 잘못된 인터페이스 포인터는 서버가 이 상황을 감지하지 않는 한 서버의 주소 공간에서 일반 보호 오류를 발생합니다.

잘못된 인터페이스 포인터로부터 보호하기 위해 서버는 액세스 가능한 개체를 래핑하고 액세스 가능한 개체의 수명을 모니터링하는 프록시 개체를 만듭니다. instance 경우 클라이언트가 IAccessible 속성을 호출하여 개체에 대한 정보를 가져올 때 프록시는 액세스 가능한 개체를 계속 사용할 수 있는지 확인하고, 그렇다면 클라이언트의 요청을 액세스 가능한 개체로 전달합니다. 액세스 가능한 개체가 제거되면 프록시는 클라이언트에 오류를 반환합니다.