2009-01-28 6 views
1

J'ai développé une application ATL console et je veux piéger la fermeture ?, quitter?, Terminer? événement afin que je puisse fermer les fichiers journaux et effectuer un nettoyage général à la sortie.Arrêter proprement une application ATL

Comment puis-je intercepter l'événement 'terminate' qui résulterait de quelqu'un terminant le .exe dans le gestionnaire de tâches?

EDIT:

Il est une application console, j'ai joint la classe principale. Pourriez-vous éventuellement indiquer où et comment utiliser 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

Votre question est en fait à propos de ATL , pas C++; pensez à changer le titre de votre question ... –

+0

** ** Vous avez une pompe de message là, quand vous obtenez un WM_QUIT, vous devez quitter la boucle while. Vérifiez également la documentation de GetMessage car votre boucle de message a un bug possible. – Dukeling

Répondre

4

Vous ne pouvez pas intercepter "Terminer le processus" dans l'onglet Processus du Gestionnaire des tâches. Si un programme pouvait le piéger, comment le tueriez-vous?

Pour répondre à "Terminer le processus" dans l'onglet Applications du Gestionnaire des tâches, gérez le message WM_CLOSE dans votre fenêtre principale.

Ceci suppose que votre application ATL est une application Windows GUI. Si c'est une application de console, vous devez regarder SetConsoleCtrlHandler.

0

Attraper Ctrl-C/Ctrl-Break n'est pas difficile. Appelez simplement SetConsoleCtrlHandler pour spécifier quelle fonction de rappel doit le gérer.

(un peu de chance) illustrant par exemple:

#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

Bien sûr, vous avez par exemple mettre fin, en control_handler remplacer

g_terminate = true; 

avec

PostMessage(HWND_BROADCAST, WM_CLOSE, 0, 0); 
Questions connexes