能力值:
( LV12,RANK:290 )
2 楼
关闭控制台窗口 类似 执行 Ctrl + C
可以试试,直接按 Ctrl + C
能力值:
( LV2,RANK:10 )
3 楼
個人臆測compiler生出的東西不同,我用一些compiler ,按ctrl-break destructor 也不會被invoke :<
請問一下先進,standard c++ 中有規定這種行為嗎?
能力值:
( LV2,RANK:10 )
4 楼
我这里测试了一下,无论什么情况关闭都不会析构,并不存在你说的问题,奇怪!
能力值:
( LV4,RANK:50 )
5 楼
我用的编译器是VC6.0,难道这只是VC的特性,WinXP只照顾微软自己的编译器?
能力值:
( LV12,RANK:250 )
6 楼
怪事年年有,今年特别多!
能力值:
( LV2,RANK:10 )
7 楼
我也是用VC6.0
能力值:
( LV4,RANK:50 )
8 楼
我的环境是: WinXP+sp2,VC6.0+sp6
运行上面的例子程序(Release模式编译),直接关闭窗口的退出得到的文件内容是"12";
任务管理器中结束进程的方法得到的文件内容是"1".
我怀疑是一般的结束任务是先给程序发一个异常,程序处理异常时会析构全局对象,其他编译器可能不会处理这个异常.
能力值:
( LV4,RANK:50 )
9 楼
我的VS2005里也是只有“1”
在任务管理器“应用程序”那个里面“结束任务”时,程序接收到CTRL_CLOSE_EVENT
在任务管理器“进程”那个里面“结束进程”时,程序接直接被中止
点击“关闭”关闭控制台窗口的话,接收到CTRL_CLOSE_EVENT 建议您用SetConsoleCtrlHandler,看下您的程序
能力值:
( LV4,RANK:50 )
10 楼
或者你看下你编译的程序里CRT有没有调用SetConsoleCtrlHandler
能力值:
( LV4,RANK:50 )
11 楼
哦,我还忘了一点:
上面我的测试都是使用VC6的动态库,
如果使用静态库,则什么输出都没有,如果在fwrite后面加上fflush,则只得到"1"了.
也许VC2003/2005的动态库也可能输出"12".
能力值:
( LV4,RANK:50 )
12 楼
谢谢,学到了
能力值:
( LV2,RANK:10 )
13 楼
控制台程序运行完就自己退出
如何让它在自己输入某个命令后才退出?
能力值:
( LV2,RANK:10 )
14 楼
详情见WINAPI:
SetWinEventHook
WinEventProc
EVENT_CONSOLE_END_APPLICATION
0x4007
A console process has exited. The idObject parameter contains the process identifier of the terminated process.
能力值:
( LV2,RANK:10 )
15 楼
错了,应该是下面这样
#include <windows.h> #include <stdio.h> BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { // Handle the CTRL-C signal. case CTRL_C_EVENT: printf( "Ctrl-C event\n\n" ); Beep( 750, 300 ); return( TRUE ); // CTRL-CLOSE: confirm that the user wants to exit. case CTRL_CLOSE_EVENT: Beep( 600, 200 ); printf( "Ctrl-Close event\n\n" ); return( TRUE ); // Pass other signals to the next handler. case CTRL_BREAK_EVENT: Beep( 900, 200 ); printf( "Ctrl-Break event\n\n" ); return FALSE; case CTRL_LOGOFF_EVENT: Beep( 1000, 200 ); printf( "Ctrl-Logoff event\n\n" ); return FALSE; case CTRL_SHUTDOWN_EVENT: Beep( 750, 500 ); printf( "Ctrl-Shutdown event\n\n" ); return FALSE; default: return FALSE; } } void main( void ) { if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) { printf( "\nThe Control Handler is installed.\n" ); printf( "\n -- Now try pressing Ctrl+C or Ctrl+Break, or" ); printf( "\n try logging off or closing the console...\n" ); printf( "\n(...waiting in a loop for events...)\n\n" ); while( 1 ){ } } else printf( "\nERROR: Could not set control handler"); }