首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >彻底关闭ATL应用程序

彻底关闭ATL应用程序
EN

Stack Overflow用户
提问于 2009-01-28 11:40:45
回答 3查看 1.3K关注 0票数 1

我已经开发了一个控制台ATL应用程序,并希望捕获关闭?,退出?,终止?事件,以便我可以关闭日志文件并在退出时执行常规清理。

如何捕获任务管理器中结束.exe的人可能导致的“终止”事件?

编辑:

这是一个控制台应用程序,我已经附加了主类。你能指出我应该在哪里和如何使用SetConsoleCtrlHandler吗?

代码语言:javascript
复制
// 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();
        }
    }
EN

回答 3

Stack Overflow用户

发布于 2009-01-28 11:46:18

您不能从任务管理器中的Process选项卡中捕获"End Process“。如果一个程序能困住它,你会怎样杀死它?

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

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

票数 4
EN

Stack Overflow用户

发布于 2009-01-29 15:48:16

抓住Ctrl/Ctrl-突破并不难。只需调用SetConsoleCtrlHandler来指定应该处理它的回调函数。

(希望)举例说明:

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2009-01-29 15:53:25

当然,要让您的示例终止,在control_handler中替换

代码语言:javascript
复制
g_terminate = true;

使用

代码语言:javascript
复制
PostMessage(HWND_BROADCAST, WM_CLOSE, 0, 0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/487340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档