返回

在Native Messaging Host中使用Java和Launch4j创建进程时的局限性分析及应对

windows

使用Java和Launch4j在Native Messaging Host中创建进程的局限性

简介

Native Messaging Host (NMH)是一种允许Web扩展与本机应用程序通信的机制。在使用Java和Launch4j创建NMH时,可能会遇到一些局限性,阻碍进程的成功创建。本文将深入探讨这些限制并提出相应的解决方法。

问题

在使用Java中ProcessBuilder创建进程时,当从NMH执行时,进程可能会创建失败。这是由于以下限制:

  • stdin字符数限制: Windows中的BAT文件读取stdin时存在128个字符的限制。

解决方法

为了解决这些限制,有两种可行的解决方法:

  1. 使用Java直接创建进程: 绕过ProcessBuilder,直接使用Java中的Runtime.exec方法创建进程。此方法允许传递命令数组,其中包括BAT文件的路径和参数。
  2. 修改BAT文件: 更改BAT文件以直接处理来自stdin的较短URL。这样可以规避128个字符的限制。

代码示例

以下是使用Runtime.exec方法直接创建进程的代码示例:

import java.io.PrintWriter;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);
        PrintWriter writer = new PrintWriter("mytestfile.txt", "UTF-8");
        if (input.hasNext()) {
            String line = input.nextLine();
            writer.println(line);
            String url = "\"" + line.substring(17, line.length()-4) + "\"";
            writer.println(url);
            writer.close();

            Runtime.getRuntime().exec(new String[] {"cmd", "/c", "C:\\Users\\Thomas\\Downloads\\VLCsaveTS.bat", url, "outfile.mp4"});
        }
    }
}

结论

通过使用替代方法或修改BAT文件,可以在Native Messaging Host中成功创建和运行进程。了解ProcessBuilder的限制以及stdin字符数限制对于解决这些问题至关重要。本文提供了详细的解决方法,帮助开发者克服这些挑战。

常见问题解答

1. 这些限制是否仅适用于使用Java和Launch4j?
否,这些限制在其他语言和平台中使用NMH时也可能存在。

2. 是否还有其他解决这些限制的方法?
本文中介绍的方法是常见且有效的解决方案,但可能还有其他未在本指南中涵盖的方法。

3. 是否有办法增加stdin字符数限制?
不幸的是,stdin字符数限制是操作系统固有的,无法通过编程方式增加。

4. 除了stdin字符数限制之外,还有其他需要考虑的限制吗?
是的,还可能存在其他限制,例如文件大小限制或执行时间限制。具体限制因平台和操作系统而异。

5. 这些解决方法是否适用于所有使用NMH的Web浏览器?
这些解决方法通常适用于支持NMH的浏览器,例如Firefox和Chrome。但是,某些浏览器可能有特定的限制或要求。