1

コンソール ATL アプリケーションを開発しましたが、close?、exit?、terminate? をトラップしたいと考えています。ログ ファイルを閉じて、終了時に一般的なクリーンアップを実行できるようにします。

誰かがタスク マネージャーで .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();
        }
    }
4

3 に答える 3

4

タスク マネージャーの [プロセス] タブから "プロセスの終了" をトラップすることはできません。プログラムがそれをトラップできるとしたら、どうやってそれを殺しますか?

タスク マネージャーの [アプリケーション] タブの [プロセスの終了] に応答するには、メイン ウィンドウで WM_CLOSE メッセージを処理します。

これは、ATL アプリが Windows GUI アプリケーションであることを前提としています。コンソール アプリケーションの場合は、SetConsoleCtrlHandler を確認する必要があります。

于 2009-01-28T11:46:18.633 に答える
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

于 2009-01-29T15:48:16.143 に答える
0

もちろん、終了する例を示すために、control_handlerで置換します

g_terminate = true;

PostMessage(HWND_BROADCAST, WM_CLOSE, 0, 0);
于 2009-01-29T15:53:25.510 に答える