Question

Je convertir en une application à utiliser CreateProcessW() au lieu de Runtime.exec() comme je l'ai besoin des informations qu'il fournit. Cependant tout appel à CreateProcessW () échoue avec le code d'erreur 5 (accès refusé). Je suis incapable de savoir pourquoi cela se produit comme Runtime.exec () fonctionne très bien dans le même cas.

Mon erreur pourrait être dans l'un des extraits de code suivant, l'appel de méthode et l'interface 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;
        }

Ma définition de CreateProcessW

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

Infos supplémentaires:

  • Runtime.exec () réussit avec les chaînes données
  • La taille de STARTUPINFO est réglé
  • Testenvironment utilisé: Windows XP SP3 et Netbeans 6.9.1

Paramètres Exemple utilisés:

  • Nom: moviemk.exe
  • Dir: C: \ Program Files \ Movie Maker \

En outre testé avec des chemins différents, donc pas un problème des espaces

Merci

Mise à jour:

Il se trouve que l'erreur a été causée par mon code d'appel de commutation autour de travail dir et le chemin exe après que je les ai vérifié. En raison de l'accès refusé, je pensais réellement qu'il en résulte au moins trouvé l'exe. Je vais ajouter un IllegalArgumentException pour prendre soin de ce problème.

Depuis que j'avais l'erreur supplémentaire avec l'exe étant par rapport au répertoire de travail que je vais accepter cette réponse. Merci à tous pour aider.

Était-ce utile?

La solution

premier paramètre de CreateProcessW doit être un chemin complet ou un chemin par rapport au répertoire courant. Il ne peut pas être un chemin relatif au paramètre de répertoire de travail, ce qui semble être ce que vous vous attendez à faire.

Essayez de passer C:\Programme\Movie Maker\moviemk.exe comme paramètre name

Autres conseils

Le premier paramètre lpApplicationName du CreateProcess fonction sera utilisée comme NULL en général et le second paramètre lpCommandLine doit contenir la ligne de commande commençant par le nom du programme que vous souhaitez démarrer.

faire frire Juste pour passer le premier et le second paramètres que vous utilisez actuellement par l'appel CreateProcessW.

Quel est le chemin complet vous entrez? Runtime.exec pourrait être l'argument interne cite, et vous pourriez être en cours d'exécution dans cette situation:

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

Peut-être il y a un préfixe au chemin qui existe et est à l'origine pour essayer d'exécuter un dossier ou un autre fichier?

Essayez de mettre des guillemets autour du chemin entier et voir si cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top