我正在运行一个Java程序,它使用CreateProcess
没有窗口(使用显示here的设置)作为我的程序的服务器。我有一个对象在其构造函数中运行该进程,保存进程句柄,并在调用TerminateProcess
时在析构函数中使用它来杀死它。
我的问题是,当我的窗口被角落里的X关闭时,这个析构函数永远不会被调用,并且进程在后台继续运行,句柄丢失,我没有迹象表明它仍在运行或者杀死它的方法(其他任务管理器)。我怎样才能确保它被杀死。
更大的图片
这是我需要做的。如果你可以建议一个更好的方法来完成这个,那也没关系。
我的程序的每次运行都需要这个java服务器的新实例(有时甚至在程序中多次)。我想在没有任何可见指示(窗口等)的情况下运行它,但这不是必需的。我做需要能够确保无论发生什么事情我打开的服务器在我完成它时被杀死,或者确保没有运行它的实例以及如果所以,在我开始一个新的之前杀了它。 (或者更好的是,两者都有。)使用进程名称并不好,因为它只是java
,并且我不想杀死计算机上的所有Java实例。我可以(如果我知道的话)检查一个程序是否在监听这个服务器使用的端口,如果是这样的话,那么它就近了。
修改
我忘了提及(如果它有所不同)GUI是C#,我无法控制它或Java程序本身。我正在编写一个c ++库,可以从C#GUI调用,需要使用Java服务器。
答案 0 :(得分:0)
创建一个名为“watchdog”的新后台进程。此过程获取主GUI和后台Java服务器的句柄,然后在GUI的进程句柄上调用WaitForSingleObject。当此调用返回时,您将终止Java服务器。
答案 1 :(得分:0)
修改DllMain入口点以处理DLL_PROCESS_DETACH。它的反应应该是执行你想要的清理工作。