CreateProcessW fallito (ACCESS_DENIED)
-
26-10-2019 - |
Domanda
Io attualmente convertire un'applicazione da utilizzare al posto di CreateProcessW()
Runtime.exec()
come ho bisogno delle informazioni che fornisce. Tuttavia qualsiasi chiamata a CreateProcessW () non riesce con il codice di errore 5 (ACCESSO NEGATO). Sono stato in grado di scoprire il motivo per cui questo accade come Runtime.exec () funziona bene nello stesso caso.
Il mio errore potrebbe essere in uno dei seguenti frammenti di codice, la chiamata al metodo e l'interfaccia 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;
}
La mia definizione di CreateProcessW
boolean CreateProcessW(WString apname,
char[] comline,
Pointer p,
Pointer p2,
boolean inheritHandles,
int createFlags,
String environment,
WString directory,
Pointer startinf,
Pointer processInfo);
Altre Informazioni:
- Runtime.exec () riesce con le date stringhe
- La dimensione del STARTUPINFO è impostato
- Testenvironment utilizzato: WinXP SP3 e NetBeans 6.9.1
parametri di esempio utilizzato:
- Nome: moviemk.exe
- Dir: C: \ Programmi \ Movie Maker \
testato anche con diversi percorsi, quindi non è un problema di spazio bianco
Grazie
Aggiornamento:
Come si scopre l'errore è stato causato dal mio codice chiamante commutazione intorno dir e il percorso exe a lavorare dopo li ho controllato. A causa del conseguente accesso negato in realtà ho pensato che almeno ha trovato l'exe. Vorrei aggiungere un IllegalArgumentException per prendersi cura di questo problema.
Da quando ho avuto l'errore supplementare con l'exe essendo relativo alla directory di lavoro accetterò questa risposta. Grazie a tutti per l'aiuto.
Soluzione
primo parametro di CreateProcessW deve essere un percorso completo o un percorso relativo alla directory corrente. Non può essere un percorso relativo al parametro directory di lavoro, che sembra quello che ci si aspetta di fare.
Prova a passare C:\Programme\Movie Maker\moviemk.exe
come parametro name
Altri suggerimenti
Il primo parametro lpApplicationName
del CreateProcess funzione verrà utilizzata come NULL
genere e il secondo parametro lpCommandLine
deve contenere la riga di comando inizia con il nome del programma che si desidera avviare.
A soli avannotti per passare il primo e il secondo parametri che si utilizzano attualmente dalla chiamata CreateProcessW
.
Qual è il percorso completo si stanno inserendo? Runtime.exec
potrebbe essere l'argomento citando internamente, e si potrebbe essere in esecuzione in questa situazione:
http://support.microsoft.com/kb/179147
Forse c'è un prefisso al percorso che esiste ed è la causa per cercare di eseguire una cartella o un altro file?
Prova a mettere tra virgolette l'intero percorso e vedere se funziona.