C 런타임 방법 [kb94248]

MFC 2014. 11. 11. 14:31

http://support.microsoft.com/kb/94248/ko

Collapse image이 페이지에서

Collapse image요약

이 문서에는 다음과 같은 섹션이 있습니다.
섹션 1: C 런타임 (CRT) 라이브러리 중 세 가지 사용할 수 있는
섹션 2: DLL에서 CRT 라이브러리를 만들 때 사용
섹션 3: NTWIN32 사용합니다.MAK 빌드 프로세스를 간소화 하기
섹션 4: 문제가 여러 CRT 라이브러리 사용 하면 발생 합니다.
섹션 5: 라이브러리 형식 혼합

Collapse image추가 정보

섹션 1: C 런타임 (CRT) 라이브러리 중 세 가지 사용할 수 있는

Win32 SDK와 함께 제공 되는 C 런타임 라이브러리의 세 가지 형식이 있습니다.
  • LIBC입니다.LIB 단일 스레드 프로그램에 정적으로 링크 된 라이브러리입니다.
  • LIBCMT입니다.LIB 다중 스레드 프로그램을 지 원하는 정적으로 링크 된 라이브러리입니다.
  • CRTDLL입니다.LIB는 가져오기 라이브러리 CRTDLL에 대 한.DLL 다중 스레드 프로그램을 지원 합니다. CRTDLL입니다.DLL 자체는 Windows NT 일부입니다.
그러나 DLL에서 CRT MSVCRT 라는, Microsoft Visual C++ 32 비트 버전 이러한 세 가지도 들어 있습니다.LIB입니다. DLL은 재배포 가능 합니다. 이름 따라 버전의 VC + + (예: MSVCRT10.DLL 또는 MSVCRT20입니다.DLL). 그러나 해당 MSVCRT10.DLL은 CRTDLL 동안 Win32s에서 지원 되지 않습니다.LIB는 Win32s에서 지원 됩니다. MSVCRT20입니다.DLL는 두 가지 버전이 있습니다: Windows NT w i n 32에 대 한.

섹션 2: DLL에서 CRT 라이브러리를 만들 때 사용



C 런타임 라이브러리를 사용 하 여 DLL을 빌드할 때 CRT 제대로 초기화를 하거나
  1. DllMain() 초기화 함수 이름을 지정 해야 하 고 링커 옵션-entry:_DllMainCRTStartup@12 기능을 사용 하 여 진입점을 지정 해야 합니다 또는-

  2. DLL의 진입점 프로세스에 CRT_INIT()를 명시적으로 호출 해야 연결 및 프로세스 분리
이렇게 하면 C 런타임 라이브러리가 올바르게 할당 하 고 프로세스 또는 스레드를이 DLL에서 및 전역 c + + 개체 DLL 올바르게 생성 되 고 소멸에 대 한 프로세스를 분리할 때 제대로 C 런타임 데이터 정리 DLL에 연결 하는 경우, C 런타임 데이터를 초기화할 수 있습니다.

모든 Win32 SDK 샘플 첫 번째 방법을 사용합니다. 예를 들어 사용 됩니다. 또한 DllEntryPoint() 및 DllMain()에 대 한 Visual C++ 문서에 대 한 Win32 프로그래머 참조를 참조 하십시오. 참고 DllMainCRTStartup() CRT_INIT() 및 CRT_INIT()를 호출 하는 경우 응용 프로그램 DllMain()를 호출 합니다.

두 번째 메서드를 사용 하 고 DllMainCRTStartup() 및 DllMain()를 사용 하는 대신 사용자가 직접 CRT 초기화 코드를 호출 하려면 두 가지 방법 있습니다.
  1. 초기화 코드를 수행 하는 항목 함수가 없으면 CRT_INIT() dll 진입점으로 지정 하면 됩니다.
    -entry:_CRT_INIT$(DLLENTRY)
    -또는-

  2. 경우 있습니다 * do * 가리키고 진입점의 다음을 수행 합니다 직접 DLL 항목이 있는:

    1. 이 프로토타입을 사용 하 여 CRT_INIT()에 대 한.
      BOOL WINAPI _CRT_INIT (HINSTANCE hinstDLL, fdwReason DWORD, lpReserved를).
      CRT_INIT() 반환 값에 대 한 내용은 DllEntryPoint; 설명서를 참조 하십시오.
    2. DLL_PROCESS_ATTACH 및 DLL_THREAD_ATTACH (참조 "DllEntryPoint" Win32 api에서는 이러한 플래그에 대 한 자세한 내용은 참조), CRT_INIT(), 먼저 전에 모든 C 런타임 함수 라고 하거나 모든 부동 소수점 연산을 수행 합니다.
    3. 프로세스/스레드 초기화/종료 코드를 호출 합니다.
    4. DLL_PROCESS_DETACH 및 DLL_THREAD_DETACH 모든 C 런타임 함수를 호출 하 고 모든 부동 소수점 작업이 완료 된 후 CRT_INIT()를 마지막으로 호출 합니다.
    전달 해야 CRT_INIT()에 항목의 매개 변수를 모두 가리킵니다.

    다음은 시기 및 DLL 진입점에서 CRT_INIT()이 호출 하 게 하는 방법을 보여 줍니다 기초 예제 항목 포인트 함수가입니다.
        BOOL WINAPI DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason,
            LPVOID lpReserved)
        {
        if (fdwReason == DLL_PROCESS_ATTACH || fdwReason == DLL_THREAD_ATTACH)
            if (!_CRT_INIT(hinstDLL, fdwReason, lpReserved))
                return(FALSE);
    
        if (fdwReason == DLL_PROCESS_DETACH || fdwReason == DLL_THREAD_DETACH)
            if (!_CRT_INIT(hinstDLL, fdwReason, lpReserved))
                return(FALSE);
        return(TRUE);
        }
    						
    이 * not * DllMain() 및 entry:_DllMainCRTStartup@12를 사용 하는 경우 필요 합니다.

섹션 3: NTWIN32 사용합니다.

매크로 NTWIN32에 정의 되어 있습니다.

컴파일을 사용 합니다.
   $(cvarsdll)          for apps/DLLs using CRT in a DLL
				
링크를 다음 중 하나를 사용 합니다.
   $(conlibsdll)        for console apps/DLLs using CRT in a DLL
   $(guilibsdll)        for GUI apps using CRT in a DLL
				

섹션 4: 문제가 여러 CRT 라이브러리 사용 하면 발생 합니다.

C 런타임 호출 하는 응용 프로그램 연결 하는 C 런타임 호출에서 사용할 수 있는 DLL를 모두와 연결 된 하나는 정적으로 링크 된 C 런타임 라이브러리 (LIBC.
  • 버퍼링 된 스트림 핸들을 전달 하면 있습니다.
  • C 런타임 호출으로 메모리를 할당 하는.
  • Errno 전역 변수 값을 설정 하거나 해당 합니다.
이러한 문제를 방지 하려면 연결 둘 다는.

섹션 5: 라이브러리 형식 혼합

DLL CRTDLL와 연결할 수 있습니다.

때 다음 믹싱 라이브러리 형식을 따릅니다.
  • 만 CRT 파일 핸들을 만든 CRT 모듈에 의해에서 운영 될 수 있습니다.
  • 만 CRT 파일 * 포인터를 만든 CRT 모듈에 의해에서 운영 될 수 있습니다.
  • CRT 함수가 malloc ()로 할당 된 메모리 해제 또는 할당 된 CRT 모듈에 의해 다시 할당할 수 있습니다.
이 보여 주기 위해 다음 예를 살펴보겠습니다.
   - .EXE is linked with MSVCRT.LIB
   - DLL A is linked with LIBCMT.LIB
   - DLL B is linked with CRTDLL.LIB
				
경우는.

DLL는 malloc () 사용 하 여 메모리 블록을 할당 합니다 free (), _expand(), 또는 realloc() 블록의 동작에 DLL A만 호출할 수 있습니다.

참고: 모든 세 가지 모듈 CRTDLL로 링크 된 경우.
때 LIBC 사용 하 여 Dll을 연결 합니다.

Collapse image속성

기술 자료: 94248 - 마지막 검토: 2004년 8월 30일 월요일 - 수정: 1.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Software Development Kit (SDK) 3.1
  • Microsoft Win32 Software Development Kit (SDK) 3.5
  • Microsoft Win32 Software Development Kit (SDK) 3.51
  • Microsoft Win32 Software Development Kit (SDK) 4.0
키워드: 
kbmt KB94248 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

 

Posted by 곰돌이짱
,