CreateProcessw не удается (acess_denied)
-
26-10-2019 - |
Вопрос
В настоящее время я преобразую приложение для использования 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);
Дополнительная информация:
- Runtime.exec () успешно с данными строками
- Размер StartupInfo установлен
- Используется TestenVironment: Winxp SP3 и NetBeans 6.9.1
Пример используемых параметров:
- Имя: Moviemk.exe
- Dir: C: Program Movie Maker
Также тестируется с разными путями, так что не проблема с пробелом
Спасибо
Обновлять:
Как выясняется, ошибка была вызвана переключением моего вызового кода вокруг рабочего Dir и Exe Path после того, как я их проверил. Из -за полученного доступа я действительно думал, что он, по крайней мере, нашел EXE. Я добавлю нелегаларгументацию, чтобы позаботиться об этой проблеме.
Поскольку у меня была дополнительная ошибка с EXE относительно рабочего режима, я приму этот ответ. Спасибо всем за помощь.
Решение
Первым параметром CreateProcessw должен быть либо полный путь, либо путь относительно текущего каталога. Это не может быть пути относительно параметра рабочего каталога, который, кажется, то, что вы ожидаете.
Попробуй пройти C:\Programme\Movie Maker\moviemk.exe
как параметр имени
Другие советы
Первый параметр lpApplicationName
принадлежащий CreateProcess функция будет использоваться как NULL
обычно и второй параметр lpCommandLine
должен содержать командную строку, начиная с имени программы, которое вы хотите начать.
Просто жарить, чтобы переключить первые и вторые параметры, которые вы используете в настоящее время на CreateProcessW
вызов.
Какой полный путь вы входите? Runtime.exec
может процитировать этот аргумент внутренне, и вы можете столкнуться с этой ситуацией:
http://support.microsoft.com/kb/179147
Может быть, есть префикс на пути, который существует и заставляет его попытаться выполнить папку или другой файл?
Попробуйте поместить цитаты по всему пути и посмотрите, поможет ли это.