我已经开发了一个控制台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();
}
}发布于 2009-01-28 11:46:18
您不能从任务管理器中的Process选项卡中捕获"End Process“。如果一个程序能困住它,你会怎样杀死它?
要响应任务管理器中应用程序选项卡上的"End Process“,请在主窗口中处理WM_CLOSE消息。
这假设您的ATL应用程序是一个Windows应用程序。如果是控制台应用程序,则需要查看SetConsoleCtrlHandler。
发布于 2009-01-29 15:48:16
抓住Ctrl/Ctrl-突破并不难。只需调用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-29 15:53:25
当然,要让您的示例终止,在control_handler中替换
g_terminate = true;使用
PostMessage(HWND_BROADCAST, WM_CLOSE, 0, 0);https://stackoverflow.com/questions/487340
复制相似问题