코드에서 명시 적으로 mainCRTStartup 함수에서 호출되는 함수를 호출 할 수있는 방법이 있습니까? 나는 특히 관심이있다 initterm 및 initterm_e 기능. 내 프로그램이 crt와 연결되었다고 생각 했어도 (맞아야 만 했겠지?) initterm을 호출 할 수 없었습니다. 선언하고 그냥 호출하려고했는데 정의되지 않은 참조가 있습니다.CRT 시작 함수를 명시 적으로 호출하는 방법
어떤 방법이 있습니까?
코드에서 명시 적으로 mainCRTStartup 함수에서 호출되는 함수를 호출 할 수있는 방법이 있습니까? 나는 특히 관심이있다 initterm 및 initterm_e 기능. 내 프로그램이 crt와 연결되었다고 생각 했어도 (맞아야 만 했겠지?) initterm을 호출 할 수 없었습니다. 선언하고 그냥 호출하려고했는데 정의되지 않은 참조가 있습니다.CRT 시작 함수를 명시 적으로 호출하는 방법
어떤 방법이 있습니까?
및 _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);
그러나 여기 아주 좋은 이해가 필요 - 무엇을, 왜 우리는 당신이 그것을 연결할 수 있도록 그것은 내보낼 수 없습니다
감사합니다. 그냥 빠른 설명 : 함수 포인터가 preincremented 대신 postincremented 수 있습니까? –
@MarcinK. 포인터로 포인터를 시작하는'__xc_a'를 사용합니다. 그래서 begin에서'ppfn'은 정확히 0 인'__xc_a'와 정확히 일치 할 것입니다. 그래서 begin에서 * ppfn은 0입니다. preincremented는 작은 최적화입니다. 그러나 postincrement를 사용하면 오류가 발생하지 않습니다. – RbMm
일 : 그래서 우리는 다음에 수행 할 수 있습니다. 어느 쪽이 더 좋은가? 이렇게하면 좋은 결과를 얻지 못할 것입니다. 프로그램을 다시 시작하기 만하면됩니다. –
@HansPassant - 아니요,이 API가 내보내집니다. * msvcrt.dll *으로 말하십시오. lib 파일에서 우리는이 이름도 찾을 수 있습니다 – RbMm
* 내 프로그램은 crt *로 링크되어 있습니다 * * lib * 정확히 사용 하시겠습니까? 이 lib를 열고'initterm' 문자열을 검색해야합니다. 그것이 존재하고 lib 파일과 정의되지 않은 참조가 잘못 선언했기 때문에 오직 – RbMm