Pregunta

Actualmente convierto una aplicación para usar CreateProcessW() en vez de Runtime.exec() Como necesito la información que proporciona. Sin embargo, cualquier llamada a CreateProcessw () falla con el código de error 5 (acceso denegado). No he podido averiguar por qué esto sucede como Runtime.exec () funciona bien en el mismo caso.

Mi error podría estar en uno de los siguientes fragmentos de código, la llamada del método y la interfaz 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;
        }

Mi definición de createprocessw

boolean CreateProcessW(WString apname,
                    char[] comline,
                    Pointer p,
                    Pointer p2,
                    boolean inheritHandles,
                    int createFlags,
                    String environment,
                    WString directory,
                    Pointer startinf,
                    Pointer processInfo);

Información adicional:

  • Runtime.exec () tiene éxito con las cadenas dadas
  • Se establece el tamaño de StartupInfo
  • TestEnvironment utilizado: WinXP SP3 y NetBeans 6.9.1

Ejemplo de parámetros utilizados:

  • Nombre: Moviemk.exe
  • Dir: C: Program Movie Maker

También probado con diferentes rutas, por lo que no es un problema de espacio en blanco

Gracias

Actualizar:

Resulta que el error fue causado por mi código de llamadas que cambiaba alrededor de la ruta Dir y Exe después de revisarlos. Debido al acceso resultante negado, realmente pensé que al menos encontró el EXE. Agregaré una IllegalArgumentException para solucionar ese problema.

Como tuve el error adicional con el EXE en relación con el directorio de trabajo, aceptaré esa respuesta. Gracias a todos por ayudar.

¿Fue útil?

Solución

El primer parámetro de CreateProcessw debe ser una ruta completa o una ruta relativa al directorio actual. No puede ser una ruta en relación con el parámetro de directorio de trabajo, que parece lo que espera que haga.

Intenta pasar C:\Programme\Movie Maker\moviemk.exe Como parámetro de nombre

Otros consejos

El primer parámetro lpApplicationName del Proceso de creación la función se utilizará como NULL típicamente y el segundo parámetro lpCommandLine debe contener la línea de comando que comienza con el nombre del programa que desea comenzar.

Solo freír para cambiar el primer y el segundo parámetros que usa actualmente por el CreateProcessW llamar.

¿Cuál es el camino completo que estás entrando? Runtime.exec Podría estar citando el argumento internamente, y podría encontrarse con esta situación:

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

¿Quizás hay un prefijo en la ruta que existe y está haciendo que intente ejecutar una carpeta u otro archivo?

Intente poner citas en todo el camino y vea si eso ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top