我有一个问题,我似乎找不到答案,但我愿意打赌,对于以前使用过此类应用程序设置的任何人来说,这可能是一个非常简单的问题。
我正在使用一个用 C 编写的应用程序,但调用 TCL/TK gui 在屏幕上做很多漂亮的事情。然而,由于 TCL/TK 从 C 运行时的工作方式,一旦您移交了控制权,您就永远无法收回它(即 TCL/TK 解释器处理应用程序退出,而不是返回到原始 main()函数)。
基本上,有一些这样的代码:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){
Tk_Main(1,argv,Tcl_AppInit); // Tcl_AppInit is a function that runs at the start
// All code after this point will never, ever run
return 0; // This return never actually occurs
}
这会导致一个小问题。我希望能够在程序退出之前销毁数据结构、关闭文件、检查内存泄漏以及执行其他必要的操作。但是,在 Tk_Main 之后我无法执行此操作。我必须找出 TCL/TK 解释器关闭时运行的钩子(Hook),然后告诉它在退出之前运行我的拆卸函数。
有人知道如何或在哪里执行此操作吗?
最佳答案
实际上有几种方法可以做到这一点:
- 不要使用 Tk_Main(),而是编写自己的不调用嵌入版本 完成后 Tcl_Exit()。起始代码可以在 generic/tkMain.c 中找到 Tk 来源。
- 使用 Tcl_SetExitProc() 注册您自己的退出处理程序,该处理程序将被调用,而不是 exit(), 允许您将控制权返回给您的程序。
- 使用 Tcl_CreateExitHandler() 在执行之前仅注册一些清理回调 Tcl_Finalize() 发生,但无论如何都会退出该进程。
处理您的情况的首选方法可能是 2。Tcl_Exit() 的联机帮助页包含您需要的所有详细信息:http://www.tcl.tk/man/tcl8.5/TclLib/Exit.htm
关于C 程序将控制权交给 TCL/Tk GUI - 如何在关闭应用程序时运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5813697/