【问题标题】:Execute an external executable within the same process space in C++在 C++ 中的同一进程空间内执行外部可执行文件
【发布时间】:2023-07-31 01:08:02
【问题描述】:

我正在尝试找到一种使用 C++ 包装器在 Windows 中执行 java vm 的简单方法。我可以使用CreateProcess() 直接启动 java.exe 并使用我需要提供的所有参数。问题是这现在在进程管理器中显示为两个进程。所以,如果我杀死父进程,java.exe 实例仍然存在。

我需要这样做的原因是我们有几个 java 程序,所有这些程序都将同时运行。我希望能够在进程资源管理器中为它们提供可区分的名称,这样如果用户遇到其中一个问题,他们就不必猜测对应的 java.exe 进程。

【问题讨论】:

  • 您不能在同一进程中执行批处理文件,期间。但是,您可能可以在同一进程中运行 Java VM。相应地编辑标题...
  • 完成了,shell 似乎只是一个命令解释器——即另一个可执行文件。那么为什么我不能在同一个进程空间中启动它呢?
  • 因为在 Windows 中,进程与可执行文件一一关联。没有等效于将另一个可执行文件加载到同一进程中的 exec() 调用。 DLL 是另一回事。然而,命令解释器不是 DLL - 它是 EXE。确切地说,是 Cmd.exe。
  • 您已经回答了自己。 :) shell 是另一个可执行文件。好吧,可能有一些传统方法可以做到这一点(如在 DOS 时代),但在 Windows 中,您通常在其自己的进程空间中加载独立(非 DLL)可执行文件。您可以暂停创建进程并等待子进程,但新进程仍将在任务管理器中显示为新进程。自己检查一下:运行 cmd.exe 并从那里启动一个命令行可执行文件。
  • 不,我相信你。我只是想更好地理解其中的原因。我来自一个 Linux 世界,这似乎是一件容易(也许更容易)完成的事情。

标签: c++ windows process ipc system


【解决方案1】:

您可以将 java.exe 替换为您自己的可执行文件。 This article from the Java Glossary 讨论 java.exe 的工作原理以及在哪里可以找到它的源代码。您可能只需复制并重命名 java.exe 即可获得

【讨论】:

  • 所以你主张将 java.exe 源代码嵌入到我的可执行文件中,然后简单地调用它?似乎应该有一种更简单的方法来完成同样的任务......基本上,我所要求的只是一个 java 启动器。
  • 我的第二个建议(复制并重命名 java.exe)怎么样?
  • 顺便说一句,如果您没有阅读参考文章,java.exe 只是一个 java 启动器。
  • 我确实阅读了链接......但它并没有真正帮助我。我正在寻找更多关于如何从 C++ 应用程序中加载 jvm.dll 的指南。
  • 您的第二个建议不是我们可以使用的...我们有大约 25 个我们使用的 Java 应用程序,我们想要一个更通用的解决方案,而不是简单地为每个应用程序重命名 java.exe 可执行文件一。不过,谢谢。
最近更新 更多