Ошибка Java CreateProcess = 193,% 1 не является допустимым приложением Win32 - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь читать и писать расширяемый формат связей (ELF). Ниже приведена строка, в которой я получаю сообщение об ошибке.

p =  r.exec("./optimizer " + sourceFile + " " + sourceFile + "a" + " " + "--all -i");

После запуска этой строки я получаю сообщение об ошибке:

java.io.IOException: Cannot run program "./optimizer": CreateProcess             
error=193, %1 is not a valid Win32 application
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
at java.lang.Runtime.exec(Runtime.java:450)
at java.lang.Runtime.exec(Runtime.java:347)
at GUIMode.GUIMode.actionPerformed(GUIMode.java:213)

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Существует несколько возможных причин появления сообщения «% 1 не является допустимым приложением Win32», включая:

  • неверный путь к приложению,
  • файл с именем pathname не распознается как исполняемый файл, или
  • исполняемый файл является 32-битным, но по какой-то причине он пытается загрузить 664-битную DLL.

В этом случае вы используете относительный путь к исполняемому файлу, поэтому возможно, что текущий каталог JVM отличается от того, что вы думаете ... и файл optimize не находится в этом каталоге.

Попробуйте следующее:

  1. Заменить "./optimizer" на абсолютный путь.

  2. Если командный (абсолютный) путь или аргументы sourceFile содержат пробелы, замените командную строку массивом строк; например,

      exec(new String[]{
             "C:/path/to/optimizer",
             sourceFile, sourceFile + "a", "--all", "-i"});
    
  3. Попробуйте запустить команду из командной строки. Идея состоит в том, чтобы убедиться, что это не вызвано неисполняемым файлом или проблемой DLL.

0 голосов
/ 03 мая 2018

Скорее всего, ваш код не работает в каталоге, который вы считаете.

Используйте код ОП, приведенный здесь: как получить текущий каталог в Java?

File directory = new File (".");
try {
    System.out.println ("Current directory's canonical path: " 
            + directory.getCanonicalPath()); 
    System.out.println ("Current directory's absolute  path: " 
                + directory.getAbsolutePath());
}catch(Exception e) {
    System.out.println("Exceptione is ="+e.getMessage());
}

Теперь сравните это с тем, где находится оптимизатор.

Вообще говоря, если вы не контролируете, как вызывается JVM, вы не можете полагаться на относительные пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...