PRB: 정적 TLS 있는 DLL 로드 LoadLibrary() 호출

기술 자료 번역 기술 자료 번역
기술 자료: 118816 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

현상

동적 연결 라이브러리 (DLL) 정적 스레드 로컬 저장소 (TLS) 할당할 __declspec (스레드)를 사용합니다. 해당 정적 라이브러리와 연결된 응용 프로그램 실행과 관련된 문제가 있습니다. 그러나 응용 프로그램에서 정적 버전을 사용하는 대신 DLL을 로드할 수 LoadLibrary 함수를 사용하는 경우 오류 코드를 87 따라 Win32s가 LoadLibrary 실패합니다: 매개 변수가 잘못되었습니다.

이 상황에서 Windows 98, Windows NT 또는 Windows 2000을 실행 중인 컴퓨터에서 LoadLibrary가 성공합니다. 그러나 정적 TLS 변수를 참조하는 DLL 함수를 호출 동작이 정의되지 않습니다. Microsoft Windows 95에서 LoadLibrary 실패하고 GetLastError 반환합니다 1114 - ERROR_DLL_INIT_FAILED (실패 한 동적 연결 라이브러리 초기화 루틴이) 작동합니다. Windows 2000에서 LoadLibrary 함수를 성공합니다. 그러나 액세스 위반을 (AV) TLS 데이터를 액세스하려고가 합니다.

원인

LoadLibrary__declspec 제한 사항입니다. 스레드의 전역 변수 공간은 런타임에 할당됩니다. 요구 사항과 정적으로 링크된 라이브러리의 모든 응용 프로그램의 요구 사항을 더한 계산 크기를 기반으로 합니다. 시스템 DLL 정적 TLS를 사용하는 LoadLibrary 또는 FreeLibrary 호출될 때 응용 프로그램에서 동적 연결된 경우, 새로 로드된 DLL에 정적 TLS 크기에 자신의 TLS 메모리 압축 프로세스에서 존재하지 및 확대하거나 모든 스레드를 찾아야 합니다. 이 프로세스가 너무 많은 관리하려면 DLL을 동적으로 로드되는 설정하거나 참조 데이터를 코드 예외가 발생할 수 있는 위해 운영 체제에 것입니다.

해결 방법

LoadLibrary 함께 __declspec (스레드)를 사용하여 DLL은 로드할 수 없습니다.

TlsAlloc 같은 이러한 TLS 함수를 사용하는 및 함께 LoadLibrary DLL을 로드할 수 있습니다 경우 TLS 할당할 DLL 코드를 수정해야 합니다. 또는 __declspec (스레드)를 사용하여 DLL만 암시적으로 응용 프로그램에 로드해야 합니다.

추가 정보

DLL 정적 TLS 사용하는지 여부를 확인하려면 헤더 정보를 덤프할 Dumpbin.exe 도구를 사용할 수 있습니다. 다음과 같이 디렉터리에서 스레드 저장소 0 (영) 보다 큰 크기의 옵션 헤더 값이 포함된 경우 DLL을 정적 TLS를 같습니다.
517B20 [18] RVA [크기] 스레드 저장소 디렉터리

속성

기술 자료: 118816 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Application Programming Interface?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows XP
키워드:?
kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com