CRT终结器(VC)

时间:2014-07-03 08:06:54

标签: c++ crt

我在“.CRT $ XTU”部分注册了一个终结器函数,但是当应用程序退出时不会调用该函数。

代码阻止1:

typedef int (__cdecl *_PVFV)();
static int __cdecl on_process_term()
{
    //do something
    return 0;
}
#pragma section(".CRT$XTU",long,read)
__declspec(allocate(".CRT$XTU"))_PVFV my_process_terminator= on_process_term;

我注册了 on_process_term(),但我的测试应用程序从未到达 on_process_term()函数。

我跟踪了crt源代码,发现这似乎是因为我的exe应用程序与crt dll动态链接。

代码块2:

#ifndef CRTDLL
        /*
         * do terminators
         */
        _initterm(__xt_a, __xt_z);
#endif  /* CRTDLL */

“代码块2”中的代码可以在 doexit()函数中找到,该函数由 exit()函数调用。

定义宏CRTDLL是因为我的exe是与crt dll动态链接的(msvcr110.dll?),所以 _initterm(__ xt_a,__ text_z); 此行已“注释掉”。所以任何终结者都不会被召唤。

代码块3:

/***
* __crtdll_callstaticterminators
*
*Purpose:
*       call terminators. This is called from CRT_INIT when dll entrypoint is
*       called with DLL_PROCESS_DETACH. We can't call the terminators from exit
*       as there may be some dll that may need crt functionality during
*       DLL_PROCESS_DETACH
*
*******************************************************************************/
void __crtdll_callstaticterminators(void) {
    /*
     * do pre-terminators
     */
    _initterm(__xp_a, __xp_z);

    /*
     * do terminators
     */
    _initterm(__xt_a, __xt_z);
}
当crt dll与应用程序分离时,将调用

__ crtdll_callstaticterminators(),并执行终止符。当文档声明时,crt dll是动态链接到我的应用程序,因此“代码块2”中的代码被“注释掉”,并且此处将调用终结器函数。但是,我的 on_process_term 在“代码块3”中的__xt_a到__xt_z的终结符中找不到。似乎“代码块2”中的终结符与“代码块3”中的终结符不同。

任何人都可以帮我解决这个问题吗?   为什么不调用 on_process_term ?以及如何让它被称为?

非常感谢!

1 个答案:

答案 0 :(得分:2)

调用它的解决方案是使用标准机制。特别是std::atexit。无论你如何链接CRT,这都是一样的。