2009-01-28 96 views
1

我开发了一个控制台ATL应用程序并且想要关闭?,退出?,终止?事件,以便我可以关闭日志文件并在退出时执行常规清理。干净地关闭一个ATL应用程序

如何捕获在任务管理器中以某人结束.exe结尾的'终止'事件?

编辑:

这是一个控制台应用程序,我已经把它贴在主类。你能否指出我应该在哪里以及如何使用SetConsoleCtrlHandler

// Override CAtlExeModuleT members 
int WinMain(int nShowCmd) throw() 
{ 
    if (CAtlBaseModule::m_bInitFailed) //ctor failed somewhere 
    { 
     ATLASSERT(0); 
     return -1; 
    } 

    HRESULT hr = S_OK; 

    LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT 

    if(ParseCommandLine(lpCmdLine, &hr)) 
    { 
     if(SUCCEEDED(RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE))) 
     { 
      CComPtr<IRORCAdapterMain> pAdapter; 

      if(SUCCEEDED(pAdapter.CoCreateInstance(L"RORCAdapter.RORCAdapterMain"))) 
      { 
       if(SUCCEEDED(pAdapter->StartAdapter())) 
       { 
        MSG msg; 

        while(GetMessage(&msg, 0, 0, 0)) 
         DispatchMessage(&msg); 
       } 
      } 

      RevokeClassObjects(); 
     } 
    } 
+0

你问题实际上是关于ATL的,而不是C++;考虑改变你的问题的标题... – 2009-01-28 11:46:54

回答

4

您无法在任务管理器的“进程”选项卡中捕获“结束进程”。如果一个程序可以捕捉它,你会如何杀死它?

要响应任务管理器中应用程序选项卡上的“结束进程”,请在主窗口中处理WM_CLOSE消息。

这假设您的ATL应用程序是Windows GUI应用程序。如果它是一个控制台应用程序,则需要查看SetConsoleCtrlHandler。

0

捕捉Ctrl-C/Ctrl-Break并不难。 只需调用SetConsoleCtrlHandler来指定哪个回调函数应该处理它。

(希望)说明例如:

#include <wincon.h> 

bool g_terminate = false; 

int main(void) 
{ 
    SetConsoleCtrlHandler(control_handler, TRUE); 

    while (!g_terminate) 
    { 
     doWork(); 
    }  
} 


int WINAPI control_handler (DWORD dwCtrlType) 
{ 
    switch(dwCtrlType) 
    { 
     case CTRL_BREAK_EVENT: 
     case CTRL_C_EVENT:  
      g_terminate = true; 
      return 1; 
     default: 
      return 0; 
    } 
} 

/L

0

关当然,有你例子终止,在control_handler更换

g_terminate = true; 

PostMessage(HWND_BROADCAST, WM_CLOSE, 0, 0);