다중 스레드 아파트에서 셸 함수 및 인터페이스 호출
다중 스레드 아파트로 초기화된 스레드에서 셸 함수 또는 셸 인터페이스를 호출하거나 액세스하는 경우 함수 또는 인터페이스의 기능이 손상되거나 완전히 실패할 수 있습니다.
원래 버전: Windows 셸 및 인터페이스
원래 KB 번호: 287087
원인
호출 스레드에서 CoInitializeEx (COINIT_MULTITHREADED)
만든 개체에 대한 호출을 모든 스레드에서 실행할 수 있도록 하는 호출입니다. 다중 스레드 아파트에서 아파트 스레딩 모델을 사용하는 개체에 액세스할 때 COM은 개체에 대한 액세스를 동기화합니다. 이 동기화가 발생하려면 COM에서 개체에 대한 호출을 마샬링해야 합니다. 셸은 현재 형식 라이브러리 또는 프록시/스텁 코드를 통해 필요한 정보를 제공하지 않으므로 개체를 마샬링하기 위해 다중 스레드 아파트에서 셸 개체에 액세스하려고 하면 실패합니다.
셸 함수에 영향을 줄 수 있는 호출
다음은 호출이 셸 개체를 CoInitializeEx (COINIT_MULTITHREADED)
사용하는 함수에 영향을 줄 수 있는 방법의 예입니다.
GetOpenFileName/GetSaveFileName
사용자는 열기 및 다른 이름으로 저장 대화 상자를 통해 내 문서와 같은 네임스페이스 확장 폴더로 이동할 수 있습니다. 그러나 브라우저에서 필요한 인터페이스(예:
IShellFolder
.)를 만들 수 없으므로 이러한 폴더를 검색할 수 없습니다.ShellExecute/ShellExecuteEx
ShellExecute
후크는 인터페이스의ShellExecute
기능을 확장하거나ShellExecuteEx
구현하여 작성할 수 있습니다IShellExecuteHook
.ShellExecute
호출되거나ShellExecuteEx
호출되면 등록된ShellExecute
후크를 로드할 수 없습니다.
이러한 두 예제에서 셸 개체 등으로 CoCreateInstance
IUnknown::QueryInterface
인터페이스 포인터를 가져오려는 구성 요소는 일반적으로 다중 스레드 아파트에서 호출될 때 오류 E_NOINTERFACE
와 함께 실패합니다. 위에서 설명한 것처럼 요청되는 개체에 대한 형식 정보 또는 프록시/스텁 코드가 없기 때문입니다.