2012-05-16 24 views
0

假设无盘情况下,我如何(在Java中)从内存中解压缩的exe文件(以及各自的支持文件)创建一个进程?java - 从内存中创建进程

我已经看到了将其解压到内存herehere但无法找到一个方法来创建一个从字节[]或InputStream中,即过程没有(文件系统)命令字符串。

想法将第三方组件捆绑到Java应用程序/项目中,而不允许它独立使用,因此将其捆绑到受密码保护的Zip中。在我的程序的执行将它解压缩到内存(EXE +支持文件),并为后者的OutputStream准备写,如:

Process process = ? 
OutputStream output = process.getOutputStream(); 
... 
output.write("my commmand to 3rd party component"); 

任何提示?

由于提前,

+0

必须有某种内存中的文件系统,你可以写可执行文件,不是吗? – bmargulies

+0

你问如何执行外部程序?如果是这样,http://www.rgagnon.com/javadetails/java-0014.html – eboix

回答

0

Windows要求进程映像驻留在OS可见的文件系统上。这意味着您需要有一个EXE解压到的“磁盘”(准确地说,是由内核模式驱动程序公开的全系统可见文件系统)。

我们提供了几种产品,可用于创建适用于从中启动EXE的虚拟文件系统,但在所有这些产品中都需要安装内核模式驱动程序。这正是Windows设计工作的方式。

因此,从流中运行本机EXE(PE格式)不幸的是不会工作。 .NET程序集可以从内存中加载/从内存中加载,并且Java类也可以使用Java运行时功能从任何地方加载,但对于本机进程而言,并非如此。

+0

好的,谢谢。但对于磁盘,我仍然需要使用受密码保护的zip的内容,而不将它们暴露在文件系统中(如果我将它们放在临时文件夹中,有人可能会发现它并将第三方组件作为独立应用程序使用)。是否有一个“标准”程序来做到这一点(因为它是在大多数“专业”应用程序和游戏中完成的)? –

+0

@PeterFialho通过我们的产品,您可以通过虚拟文件系统公开您的数据,但是您可以将对文件系统的访问限制为只有系统进程,以便其他人无法访问它。至于你的第二个问题,我不能评论一般的应用程序和游戏,但我还没有看到一个游戏产生了一个没有任何东西在磁盘上的过程 –

0

我可以看到几种可能的方法:

  1. 解压到内存中的文件系统。
  2. 编写自定义class loader,可直接从ZIP文件加载类。

在这两者中,第一个可能需要较少的工作。

+1

我认为方法#2是不可能的,因为彼得要求执行“exe +支持文件”,这暗示了非Java在Windows上可执行。所以这只留下了Ramdisk方法。 – Kosi2801

+0

没错,它是一个非Java第三方组件。我不知道ram文件系统,现在正在检查Apache Commons VFS。谢谢! –