Сбой CreateProcessW (ACESS_DENIED) - PullRequest
       16

Сбой CreateProcessW (ACESS_DENIED)

1 голос
/ 28 января 2011

В настоящее время я преобразовываю приложение для использования 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 \

Также тестируется с разными путями, поэтому проблем с пробелами нет

Спасибо

Обновление:

Как выяснилось, ошибка была вызвана тем, что мой код вызова переключался между рабочими каталогами dir и exe после того, как я их проверил.Из-за полученного доступа отказано, я действительно думал, что он по крайней мере нашел exe.Я добавлю IllegalArgumentException для решения этой проблемы.

Поскольку у меня была дополнительная ошибка, связанная с тем, что exe-файл связан с рабочим каталогом, я приму этот ответ.Спасибо всем за помощь.

Ответы [ 3 ]

1 голос
/ 28 января 2011

Первый параметр CreateProcessW должен быть либо полным путем, либо путем относительно текущего каталога.Это не может быть путь относительно параметра рабочего каталога, что похоже на то, что вы ожидаете от него.

Попробуйте передать C:\Programme\Movie Maker\moviemk.exe в качестве параметра имени

1 голос
/ 28 января 2011

Первый параметр lpApplicationName функции CreateProcess обычно будет использоваться как NULL, а второй параметр lpCommandLine должен содержать командную строку, начиная с имени программы, которую вы хотите запустить.

Просто поджарьте, чтобы переключить первый и второй параметры, которые вы используете в данный момент, при вызове CreateProcessW.

0 голосов
/ 28 января 2011

Какой полный путь вы вводите?Runtime.exec может заключать аргумент в кавычки внутри, и вы можете столкнуться с такой ситуацией:

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

Возможно, существует префикс к пути, который существует и вызывает его попыткувыполнить папку или другой файл?

Попробуйте поставить кавычки по всему пути и посмотреть, поможет ли это.

...