다중 스레드 아파트에서 셸 함수 및 인터페이스 호출

  • 아티클
  • 2023. 07. 17.
  •  

이 문서의 내용

  1. 원인
  2. 셸 함수에 영향을 줄 수 있는 호출
  3. 참조

다중 스레드 아파트로 초기화된 스레드에서 셸 함수 또는 셸 인터페이스를 호출하거나 액세스하는 경우 함수 또는 인터페이스의 기능이 손상되거나 완전히 실패할 수 있습니다.

원래 버전: Windows 셸 및 인터페이스
원래 KB 번호: 287087

원인

호출 스레드에서 CoInitializeEx (COINIT_MULTITHREADED) 만든 개체에 대한 호출을 모든 스레드에서 실행할 수 있도록 하는 호출입니다. 다중 스레드 아파트에서 아파트 스레딩 모델을 사용하는 개체에 액세스할 때 COM은 개체에 대한 액세스를 동기화합니다. 이 동기화가 수행되려면 COM에서 개체에 대한 호출을 마샬링해야 합니다. 셸은 현재 형식 라이브러리 또는 프록시/스텁 코드를 통해 필요한 정보를 제공하지 않으므로 해당 개체를 마샬링하기 위해 다중 스레드 아파트에서 셸 개체에 액세스하려고 하면 실패합니다.

셸 함수에 영향을 줄 수 있는 호출

다음은 호출이 셸 개체를 CoInitializeEx (COINIT_MULTITHREADED) 사용하는 함수에 영향을 줄 수 있는 방법의 예입니다.

  • GetOpenFileName/GetSaveFileName
  • 사용자는 열기 및 다른 이름으로 저장 대화 상자를 통해 내 문서와 같은 네임스페이스 확장 폴더로 이동할 수 있습니다. 그러나 브라우저에서 필요한 인터페이스(예: IShellFolder)를 만들 수 없으므로 이러한 폴더를 검색할 수 없습니다.
  • ShellExecute/ShellExecuteEx
  • ShellExecute 후크를 작성하여 인터페이스의 ShellExecute 기능을 확장하거나 ShellExecuteEx 구현할 수 있습니다 IShellExecuteHook . ShellExecute 호출되거나 ShellExecuteEx 호출되면 등록된 ShellExecute 후크를 로드할 수 없습니다.

이러한 두 예제에서 셸 개체CoCreateInstanceIUnknown::QueryInterface에 대한 인터페이스 포인터를 가져오려는 구성 요소는 일반적으로 다중 스레드 아파트에서 호출될 때 오류 E_NOINTERFACE 와 함께 실패합니다. 위에서 설명한 것처럼 요청되는 개체에 대한 형식 정보 또는 프록시/스텁 코드가 없기 때문입니다.

참조

프로세스, 스레드 및 아파트

Posted by gurupia
,