1

我目前将应用程序转换为使用,CreateProcessW()而不是Runtime.exec()因为我需要它提供的信息。但是,对 CreateProcessW() 的任何调用都会失败,并显示错误代码 5 (ACCESS DENIED)。我一直无法找出为什么会发生这种情况,因为 Runtime.exec() 在相​​同的情况下运行良好。

我的错误可能出现在以下代码片段之一、方法调用和 jna 接口中。

public ProcessInfo createProcess(String dir, String name){
            ProcessInfo pi = new ProcessInfo();
            StartupInfo start = new StartupInfo();
            mem.CreateProcessW(new WString(name),
                    null,
                    null,
                    null,
                    false,
                    0,
                    null,
                    new WString(dir),
                    start.getPointer(),
                    pi.getPointer());
            return pi;
        }

我对 CreateProcessW 的定义

boolean CreateProcessW(WString apname,
                    char[] comline,
                    Pointer p,
                    Pointer p2,
                    boolean inheritHandles,
                    int createFlags,
                    String environment,
                    WString directory,
                    Pointer startinf,
                    Pointer processInfo);

附加信息:

  • Runtime.exec() 使用给定的字符串成功
  • 设置 StartupInfo 的大小
  • 使用的测试环境:WinXP SP3 和 Netbeans 6.9.1

使用的示例参数:

  • 名称:moviemk.exe
  • 目录:C:\Programme\Movie Maker\

还用不同的路径进行了测试,所以不是空格问题

谢谢

更新:

事实证明,错误是由于我在检查后调用代码在工作目录和 exe 路径周围切换引起的。由于导致访问被拒绝,我实际上认为它至少找到了 exe。我将添加一个 IllegalArgumentException 来解决这个问题。

由于我遇到了与工作目录相关的 exe 附加错误,因此我将接受该答案。感谢大家的帮助。

4

3 回答 3

1

CreateProcess函数的第一个参数lpApplicationName将照常使用,第二个参数应包含以您要启动的程序名称开头的命令行。NULLlpCommandLine

只需通过CreateProcessW调用切换您当前使用的第一个和第二个参数。

于 2011-01-28T15:26:20.497 回答
1

CreateProcessW 的第一个参数必须是完整路径或相对于当前目录的路径。它不能是相对于工作目录参数的路径,这看起来就像您期望的那样。

尝试C:\Programme\Movie Maker\moviemk.exe作为名称参数传递

于 2011-01-28T18:24:39.310 回答
0

您输入的完整路径是什么?Runtime.exec可能会在内部引用参数,您可能会遇到这种情况:

http://support.microsoft.com/kb/179147

也许存在路径的前缀并导致它尝试执行文件夹或其他文件?

尝试在整个路径周围加上引号,看看是否有帮助。

于 2011-01-28T17:07:16.757 回答