2017-09-20 5 views
0

코드에서 명시 적으로 mainCRTStartup 함수에서 호출되는 함수를 호출 할 수있는 방법이 있습니까? 나는 특히 관심이있다 initterminitterm_e 기능. 내 프로그램이 crt와 연결되었다고 생각 했어도 (맞아야 만 했겠지?) initterm을 호출 할 수 없었습니다. 선언하고 그냥 호출하려고했는데 정의되지 않은 참조가 있습니다.CRT 시작 함수를 명시 적으로 호출하는 방법

어떤 방법이 있습니까?

+0

일 : 그래서 우리는 다음에 수행 할 수 있습니다. 어느 쪽이 더 좋은가? 이렇게하면 좋은 결과를 얻지 못할 것입니다. 프로그램을 다시 시작하기 만하면됩니다. –

+0

@HansPassant - 아니요,이 API가 내보내집니다. * msvcrt.dll *으로 말하십시오. lib 파일에서 우리는이 이름도 찾을 수 있습니다 – RbMm

+0

* 내 프로그램은 crt *로 링크되어 있습니다 * * lib * 정확히 사용 하시겠습니까? 이 lib를 열고'initterm' 문자열을 검색해야합니다. 그것이 존재하고 lib 파일과 정의되지 않은 참조가 잘못 선언했기 때문에 오직 – RbMm

답변

1
_initterm

_initterm_e (MSDN _initterm_e의 메모가 잘못 선언 - 정말이 _PIFV 유형을 사용하는) 다른 CRT DLL을 내 보낸. lib 파일에서도 선언했습니다. 이 기능의 구현은 매우 간단합니다 :

typedef void (__cdecl *_PVFV)(); 

void _initterm(const _PVFV *ppfn, const _PVFV *end) 
{ 
    do 
    { 
     if (_PVFV pfn = *++ppfn) 
     { 
      pfn(); 
     } 
    } while (ppfn < end); 
} 

typedef int (__cdecl *_PIFV)(); 

int _initterm_e(const _PIFV *ppfn, const _PIFV *end) 
{ 
    do 
    { 
     if (_PIFV pfn = *++ppfn) 
     { 
      if (int err = pfn()) return err; 
     } 
    } while (ppfn < end); 

    return 0; 
} 

그래서 당신은 자신의 구현을 사용할 수 있습니다. 빠른 질문 - 입력 매개 변수로 사용하는 것은 무엇입니까?

는 C++ 장소 C++ 세계의 초기화를위한 (".CRT$XCA", ".CRT$XCZ") 섹션을 사용 (방법 최소 CL 컴파일러) 을 말한다.

extern "C" 
{ 
#pragma const_seg(".CRT$XCA") 
    const _PVFV __xc_a = 0; 
#pragma const_seg(".CRT$XCZ") 
    const _PVFV __xc_z = 0; 

#pragma const_seg(".CRT$XIA") 
    const _PVFV __xi_a = 0; 
#pragma const_seg(".CRT$XIZ") 
    const _PVFV __xi_z = 0; 
} 

    /* 
    * do initializations 
    */ 
    initret = _initterm_e(&__xi_a, &__xi_z); 
    if (initret != 0) 
     return initret; 

    /* 
    * do C++ initializations 
    */ 
    _initterm(&__xc_a, &__xc_z); 

그러나 여기 아주 좋은 이해가 필요 - 무엇을, 왜 우리는 당신이 그것을 연결할 수 있도록 그것은 내보낼 수 없습니다

+0

감사합니다. 그냥 빠른 설명 : 함수 포인터가 preincremented 대신 postincremented 수 있습니까? –

+0

@MarcinK. 포인터로 포인터를 시작하는'__xc_a'를 사용합니다. 그래서 begin에서'ppfn'은 정확히 0 인'__xc_a'와 정확히 일치 할 것입니다. 그래서 begin에서 * ppfn은 0입니다. preincremented는 작은 최적화입니다. 그러나 postincrement를 사용하면 오류가 발생하지 않습니다. – RbMm

관련 문제