碰到一个比较郁闷的问题,我有一个进程,运行时动态分配了一些子进程(这些进程没有源码,不可修改),在我的主进程被任务管理器被杀死时,要保证这些子进程同时被杀掉。起初我通过信号机制来实现,后来发现通过信号量无法捕获到任务管理器中结束进程的信号量,后来知道这里是通过TerminateProcess实现的,所以现在想到的方法是hook TerminateProcess,在系统调用TerminateProcess之前,通过进程之间的通信,与我在主进程中创建的一个线程进行交互,线程收到消息后,杀死子进程,然后告诉hook函数,已经ok了,此时hook函数调用系统的TerminateProcess函数,关闭主进程。
不知道大家有没有什么好的方法,我觉得这样很麻烦,但是又想不出别的好方法来。

解决方案 »

  1.   

    不可以在自己的 WM_CLOSE 里进行处理吗?应该是收到这个消息的吧 
      

  2.   

    恩 没有窗口的 不是gui形式的,通过任务管理器关闭进程时,想在进程被杀死之前做一些处理,但是windows下不知道有没有什么好的办法捕获这样的信号
      

  3.   

    CONSOLE 类型的程序,也应该有相应机制的吧,参考下下面这个页面http://bbs.pediy.com/archive/index.php?t-45183.html 最后的示例?应该是可以接受到 CTRL_CLOSE_EVENT 通知的。
      

  4.   

    你说的hook TerminateProcess并不可靠,即便一定调该函数来结束进程,但任何程序都可以调该函数,你仅仅勾住任务管理器的TerminateProcess并不管用,比方说人家可以用xuetr、诺顿任务管理器、procexp等。在3环,你很难做一个全局的函数钩子,当然客户机就运行你这个程序,那另说。正确的做法是你给子进程附加一个dll(或者修改exe代码),该dll的内容很简单,就是和主进程心跳,收不到就自己结束自己。既然你能够给任务管理器写钩子,说明拉起dll的技术你已经有了,主要是你的思路的问题。