繁体   English   中英

如何将成员函数传递给SetConsoleCtrlHandler()?

[英]How to pass member function to SetConsoleCtrlHandler()?

我有以下用于命令行应用程序的代码(示例)。 我想确保在ctrl + c Event上调用Disconnect。 这就是为什么我添加处理程序。 我可以使CtrlHandler成为成员函数,以便在按ctrl + c时,该处理程序具有有效的Foo对象来调用Disconnect()吗?

#include <windows.h> 

class Foo
{

 public :
     Foo()
     {
      Connect();
     }
     virtual ~Foo()
     {
       Disconnect();
     }

  protected:
     Run();
     Connect();
     Disconnect();
};

BOOL CtrlHandler(DWORD fdwCtrlType)
{
    switch (fdwCtrlType)
    {
        // Handle the CTRL-C signal. 
    case CTRL_C_EVENT:
        //Disconnect somehow
        return(TRUE);
    default:
        return FALSE;
    }
}




int main(int argc, char* argv[])
 {
  SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
  Foo myFoo;
  myFoo.Run();        
 }

您唯一的选择是自己管理回调的上下文。 在单线程应用程序一个非常简单的方法,即Run不重新输入可以。

#include <windows.h> 

class Foo
{

 public :
     Foo()
     {
      Connect();
     }
     virtual ~Foo()
     {
       Disconnect();
     }

  protected:
  static Foo* current_foo;
  static BOOL CtrlHandler(DWORD fdwCtrlType)
  {
    switch (fdwCtrlType)
    {
        // Handle the CTRL-C signal. 
    case CTRL_C_EVENT:
        current_foo->Disconnect();
        return(TRUE);
    default:
        return FALSE;
    }
  }

     Run() {
       Foo::current_foo = this;
       SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
       // Other things
     }
     Connect();
     Disconnect();
};

Foo* Foo::current_foo = nullptr;    

int main(int argc, char* argv[])
{
  Foo myFoo;
  myFoo.Run();        
}

但是,请允许我重申一下:对于不那么琐碎的应用程序,您将需要更强大的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM