我目前将应用转换为使用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);
其他信息:
使用的示例参数:
还测试了不同的路径,因此不是空白问题
由于
更新
事实证明,错误是由我的调用代码在我检查它们之后切换工作目录和exe路径引起的。由于结果访问被拒绝,我实际上认为它至少找到了exe。我将添加一个IllegalArgumentException来处理这个问题。
由于我有一个额外的错误,exe是相对于工作目录我会接受这个答案。感谢所有人的帮助。
答案 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
也许存在路径的前缀并导致它尝试执行文件夹或其他文件?
尝试在整个路径上加上引号,看看是否有帮助。