0

我正在运行一个 Java 程序,它充当我的程序的服务器,使用CreateProcess无窗口(使用此处显示的设置)。我有一个对象,它在其构造函数中运行进程,保存进程句柄,并在析构函数中使用它TerminateProcess来杀死它。

我的问题是,当我的窗口在角落里的 X 关闭时,这个析构函数永远不会被调用并且进程继续在后台运行,句柄丢失了,我没有迹象表明它仍在运行或杀死它(其他任务管理器)。我怎样才能确保它被杀死。

大图
这是我需要做的。如果您可以提出更好的方法来完成此任务,那也很好。
每次运行我的程序(有时甚至在程序中多次)时,我都需要这个 java 服务器的一个新实例。我想在没有任何可见指示(窗口等)的情况下运行它,但这不是必需的。我确实需要能够确保无论发生什么情况,我打开的服务器在我完成后都会被杀死,或者确保没有正在运行的实例,如果是这样,在我开始之前杀死它一个新的。(或者更好的是,两者都是。)使用进程名称并不好,因为它只是java,而且我不想杀死计算机上的所有 Java 实例。我可以(如果我知道如何)检查程序是否正在侦听此服务器使用的端口,如果是,请关闭它。

编辑
我忘了提到(如果有区别的话)GUI 是 C#,我无法控制它或 Java 程序本身。我正在用 C++ 编写一个从 C# GUI 调用并需要使用 Java 服务器的库。

4

2 回答 2

0

创建一个名为“看门狗”的新后台进程。此进程获取主 GUI 和后台 Java 服务器的句柄,然后在 GUI 的进程句柄上调用 WaitForSingleObject。当此调用返回时,您将终止 Java 服务器。

于 2013-02-07T08:37:22.913 回答
0

修改您的DllMain入口点以处理 DLL_PROCESS_DETACH。它的响应应该是执行您想要的任何清理。

于 2013-02-07T08:41:08.960 回答