Frage

Ich wandelte derzeit eine Anwendung zur Verwendung um CreateProcessW() Anstatt von Runtime.exec() Da ich die Informationen benötige, die es liefert. Jeder Anruf bei CreateRCessW () schlägt jedoch mit dem Fehlercode 5 (Zugriff verweigert) fehl. Ich konnte nicht herausfinden, warum dies im selben Fall gut läuft.

Mein Fehler könnte in einem der folgenden Code -Snippets, dem Methodenaufruf und der JNA -Schnittstelle liegen.

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;
        }

Meine Definition von CreateProcessW

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

Zusätzliche Information:

  • Runtime.exec () gelingt mit den angegebenen Saiten
  • Die Größe des Startupinfo ist eingestellt
  • Verwendung

Beispielparameter verwendet:

  • Name: moviemk.exe
  • DIR: C: Programm Movie Maker

Auch mit unterschiedlichen Pfaden getestet, also nicht mit einem Whitespace -Problem

Vielen Dank

Aktualisieren:

Wie sich herausstellte, wurde der Fehler durch mein Aufrufcode verursacht, das sich nach dem Überprüfungen um den Working Dir- und EXE -Pfad umschaltete. Aufgrund des daraus resultierenden Zugangs habe ich tatsächlich gedacht, dass er zumindest den Exe gefunden habe. Ich werde eine IllegalargumentException hinzufügen, um dieses Problem zu erledigen.

Da ich den zusätzlichen Fehler hatte, wenn der Exe relativ zum Arbeitsverfahren war, werde ich diese Antwort akzeptieren. Vielen Dank an alle für die Hilfe.

War es hilfreich?

Lösung

Der erste Parameter von CreateProcessW muss entweder ein vollständiger Weg oder ein Pfad relativ zum aktuellen Verzeichnis sein. Es kann kein Weg in Bezug auf den Parameter Arbeitsverzeichnis sein, der so aussieht, als ob Sie es erwarten.

Versuchen Sie, zu bestehen C:\Programme\Movie Maker\moviemk.exe als Name Parameter

Andere Tipps

Der erste Parameter lpApplicationName des Createprocess Funktion wird verwendet als NULL Typischerweise und der zweite Parameter lpCommandLine Sollte die Befehlszeile enthalten, beginnend mit dem Programmnamen, den Sie starten möchten.

Braten Sie einfach, um die erste und die zweiten Parameter zu wechseln, die Sie derzeit von der verwenden CreateProcessW Anruf.

Was ist der volle Weg, den Sie eingeben? Runtime.exec Könnte das Argument intern zitieren, und Sie könnten in diese Situation stoßen:

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

Vielleicht gibt es ein Präfix für den Weg, der existiert und es dazu bringt, einen Ordner oder eine andere Datei auszuführen?

Versuchen Sie, Zitate rund um den gesamten Weg zu legen, und prüfen Sie, ob dies hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top