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

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

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

원인

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

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

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

  • GetOpenFileName/GetSaveFileName

    사용자는 열기 및 다른 이름으로 저장 대화 상자를 통해 내 문서와 같은 네임스페이스 확장 폴더로 이동할 수 있습니다. 그러나 브라우저에서 와 같은 IShellFolder필수 인터페이스를 만들 수 없으므로 이러한 폴더를 검색할 수 없습니다.

  • ShellExecute/ShellExecuteEx

    ShellExecute 후크는 의 기능을 ShellExecuteShellExecuteEx 확장하거나 인터페이스를 구현하여 작성할 수 있습니다 IShellExecuteHook . ShellExecute 또는 ShellExecuteEx 가 호출되면 등록된 ShellExecute 후크를 로드할 수 없습니다.

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

참조

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