다중 스레드 아파트에서 셸 함수 및 인터페이스 호출
- 아티클
- 2023. 07. 17.
이 문서의 내용
다중 스레드 아파트로 초기화된 스레드에서 셸 함수 또는 셸 인터페이스를 호출하거나 액세스하는 경우 함수 또는 인터페이스의 기능이 손상되거나 완전히 실패할 수 있습니다.
원래 버전: 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 와 함께 실패합니다. 위에서 설명한 것처럼 요청되는 개체에 대한 형식 정보 또는 프록시/스텁 코드가 없기 때문입니다.
참조
'[Microsoft]' 카테고리의 다른 글
자음 표시가 있는 반자 및 전폭 가타카나 및 히라가나 문자는 다른 것으로 처리됩니다. (0) | 2023.11.03 |
---|---|
관리자 권한으로 실행할 때 데스크톱 브리지 앱이 시작되지 않습니다. (0) | 2023.11.03 |
CY 값이 크면 VarI8FromCy에서 잘못된 값을 생성합니다. (0) | 2023.11.03 |
COM+ 개체를 사용하도록 설정하면 두 개의 DLL 호스트가 시작됩니다. (0) | 2023.11.03 |
OLE 스레딩 모델의 설명 및 작업 (0) | 2023.11.03 |