如何在Delphi控制台应用程序中处理Ctrl + C?

mjn*_*mjn 9 delphi console

是否有可用的最佳实践和代码片段,说明如何在Delphi控制台应用程序中处理Ctrl + C?

我找到了一些文章,它们提供了一些关于调试器可能存在的问题的信息,包括异常处理,DLL的卸载,stdin的关闭,以及例如这个CodeGear论坛线程的最终化.

Nic*_*kis 17

从Windows API(MSDN):

BOOL WINAPI SetConsoleCtrlHandler(
    PHANDLER_ROUTINE HandlerRoutine,    // address of handler function  
    BOOL Add    // handler to add or remove 
   );   
Run Code Online (Sandbox Code Playgroud)

HandlerRoutine函数是控制台进程指定处理进程接收的控制信号的函数.该函数可以具有任何名称.

BOOL WINAPI HandlerRoutine(
    DWORD dwCtrlType    //  control signal type
   );   
Run Code Online (Sandbox Code Playgroud)

在Delphi中,处理程序例程应该是这样的:

function console_handler( dwCtrlType: DWORD ): BOOL; stdcall;
begin
  // Avoid terminating with Ctrl+C
  if (  CTRL_C_EVENT = dwCtrlType  ) then
    result := TRUE
  else
    result := FALSE;
end;
Run Code Online (Sandbox Code Playgroud)

  • 要记住的非常重要的事情是HandlerRoutine在单独的线程中运行.如果您自己不启动任何其他线程,请将IsMultithread全局变量设置为True,以便您执行的任何内存操作都是安全的. (5认同)
  • 呼叫惯例也很重要.回调函数必须使用stdcall调用约定,否则你的程序将神秘地崩溃. (3认同)
  • 原来如此.如果您捕获Ctrl + C,就像我的示例一样,您可以设置一种"标志",并在需要时正常终止*. (2认同)