目前,我将应用程序转换为使用CreateProcessW()而不是Runtime.exec(),因为我需要它提供的信息。但是,对CreateProcessW()的任何调用都会失败,错误代码5(访问被拒绝)。我一直无法找出为什么会发生这种情况,因为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);附加信息:
使用的示例参数:
也用不同的路径进行测试,所以不存在空白问题。
谢谢
更新:
事实证明,这个错误是由我的调用代码在我检查工作dir和exe路径后切换它们引起的。由于结果访问被拒绝,我实际上认为它至少找到了exe。我将添加一个IllegalArgumentException来解决这个问题。
因为我有一个额外的错误,即exe相对于工作dir,所以我将接受这个答案。感谢大家的帮助。
发布于 2011-01-28 18:24:39
CreateProcessW的第一个参数必须是完整路径或相对于当前目录的路径。它不能是相对于工作目录参数的路径,这似乎是您期望它所做的。
尝试将C:\Programme\Movie Maker\moviemk.exe作为名称参数传递
发布于 2011-01-28 15:26:20
通常,lpApplicationName函数的第一个参数NULL将用作NULL,而第二个参数lpCommandLine应该包含以您想要启动的程序名开头的命令行。
只需将第一个和第二个参数转换为CreateProcessW调用当前使用的参数即可。
发布于 2011-01-28 17:07:16
您要输入的完整路径是什么?Runtime.exec可能在内部引用该参数,您可能会遇到以下情况:
http://support.microsoft.com/kb/179147
可能存在路径的前缀,并导致它试图执行文件夹或其他文件?
试着在整个路径周围加上引号,看看这是否有帮助。
https://stackoverflow.com/questions/4829031
复制相似问题