CreateProcess失败(ACCESS_DENIED)

时间:2011-01-28 14:01:10

标签: java winapi jna createprocess

我目前将应用转换为使用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
  • Dir:C:\ Program \ Movie Maker \

还测试了不同的路径,因此不是空白问题

由于

更新

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

由于我有一个额外的错误,exe是相对于工作目录我会接受这个答案。感谢所有人的帮助。

3 个答案:

答案 0 :(得分:1)

CreateProcess函数的第一个参数lpApplicationName通常用作NULL,第二个参数lpCommandLine应包含以程序名称开头的命令行想要开始。

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

答案 1 :(得分:1)

CreateProcessW的第一个参数必须是完整路径或相对于当前目录的路径。它不能是相对于工作目录参数的路径,这似乎是您期望它做的。

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

答案 2 :(得分:0)

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

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

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

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