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