任务管理器关闭程序的时候会通知该程序吗?还有程序非正常退出时,要是还想执行一些代码应该在哪里写?

解决方案 »

  1.   

    挂接API:TerminateProcess,ExitProcess
      

  2.   

    是Hook这两个函数吗?还有没有其他方法,比如说异常处理?
      

  3.   

    在APP的下面函数:int CRwefwertwertApp::ExitInstance() 
    {
    // TODO: Add your specialized code here and/or call the base class
    MessageBox( NULL , "这里就可以知道" , "这里就可以知道" , 0 );
    return CWinApp::ExitInstance();
    }
      

  4.   

    To QunKangLi(雾痕),
    冤啊~~~~~!
    我不是想做木马,不要冤枉我啊!!^_^而是我的程序中为了不会同时开启两个以上实例,自己用了GlobalAddAtom等一类函数,正常退出时我再调用GlobalDeleteAtom就可以了。可是如果程序非正常关闭,那个Atom就会留在内存当中,导致再想重新启动程序就会失败。很是郁闷。所以想问问有没有办法解决这个问题?To ChangeMyHead(改头换面),
    你这个方法在正常退出时可以,但我是要非正常退出时也处理。不信你把这个程序用任务管理器结束一下试试,不会弹出对话框的。
      

  5.   

    QunKangLi(雾痕)来帮帮忙啊!大家都来帮帮忙啊!
      

  6.   

    //取进程中是否有你要的,如果遍历所有的进程没有找到,那么你的程序就被关闭了
       DWORD aProcesses[ 1024 ];
        DWORD cProcesses = GetProcessIDs( aProcesses, sizeof( aProcesses ) ); DWORD idxList = 0; //遍历所有的进程
    for( DWORD idx = 0; idx < cProcesses; idx++ )
    {
    //返回进程的名称
    CString sName = GetProcessBaseModuleName( aProcesses[ idx ] );
                      if (sName==你的程序)
                         ......
             }
    /////////////////////////////////////////////////////////////////////////////
    //列举所有的进程
    //BOOL WINAPI EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD * cbNeeded);
    //DWORD * lpidProcess,//指针指向存放进程ID的数组
    //DWORD cb, //数组大小
    //DWORD * cbNeeded //返回的实际大小
    DWORD GetProcessIDs( DWORD* pdwBuffer, DWORD dwSizeBuffer )
    {
    DWORD cbNeeded = 0;    if( !EnumProcesses( pdwBuffer, dwSizeBuffer, &cbNeeded ) )
    {
    ASSERT( FALSE );
    return( 0 );
    }
        
    return( cbNeeded / sizeof( DWORD ) );
    }
      

  7.   

    用命名事件或其它的命名内核对象来实现进程的唯一性最好办.
    程序初使化时检查同名对象是否存在就行,如果是信号量对象,还可以人为设置允许的进程数.
    以事件为例:
    #define EXIST_EVENT_NAME "IsMyProcessExist"
    BOOL CYourMainApp::InitInstance()
    HANDLE hExist ;
    hExist = CreateEvent( 
    NULL, TRUE, FALSE, _T(EXIST_EVENT_NAME) ) ;
    if( NULL == hExist )//异常...
    return FALSE ;
    if( ERROR_ALREADY_EXISTS == GetLastError() )//已经有一个进程在运行
    return FALSE ;