我在“.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 ?以及如何让它被称为?
非常感谢!
答案 0 :(得分:2)
调用它的解决方案是使用标准机制。特别是std::atexit
。无论你如何链接CRT,这都是一样的。