4 votes

Flex3 / Air 2 : NativeProcess n'accepte pas les données d'entrée standard (Erreur #2044 & #3218)

J'essaie d'ouvrir cmd.exe sur un nouveau processus et de passer du code pour éjecter un périphérique par programme ; mais lorsque j'essaie de le faire, tout ce que j'obtiens c'est.. :

"Erreur #2044 : Unhandled IOErrorEvent :. text=Error #3218 : Erreur lors de l'écriture de données dans NativeProcess.standardInput."

Voici mon code :

    private var NP:NativeProcess = new NativeProcess();

    private function EjectDevice():void
    {
             var RunDLL:File = new File("C:\\Windows\\System32\\cmd.exe");
             var NPI:NativeProcessStartupInfo = new NativeProcessStartupInfo();
             NPI.executable = RunDLL;
             NP.start(NPI);
             NP.addEventListener(Event.STANDARD_OUTPUT_CLOSE, CatchOutput, false, 0, true);
             NP.standardInput.writeUTFBytes("start C:\\Windows\\System32\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll");
             NP.closeInput();
    }

J'ai également essayé avec writeUTF au lieu de writeUTFBytes, mais j'obtiens toujours l'erreur. Quelqu'un a-t-il une idée de ce que je fais de travers ?

Merci pour votre temps :) Edward.

2voto

Ben Points 9182

Peut-être que cmd.exe ne gère pas standardInput comme un processus normal.

Vous pouvez essayer de passer ce que vous voulez exécuter comme paramètres au processus cmd, plutôt que d'écrire dans l'entrée standard.

Je pense que

cmd.exe /C "start C:\Windows\System32\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll"

est le format permettant de passer un paramètre à cmd pour qu'il l'exécute immédiatement.

Ce site présente un exemple de transmission de paramètres de processus à l'aide d'un vecteur de chaîne :

http://blogs.adobe.com/cantrell/archives/2009/11/demo_of_nativeprocess_apis.html

2voto

abudaan Points 111

Essayez-le sans la dernière ligne "NP.closeInput() ;"

Voir aussi

http://help.adobe.com/en_US/as3/dev/WSb2ba3b1aad8a27b060d22f991220f00ad8a-8000.html

1voto

Adrian Parker Points 131

Je suis d'accord avec abudaan, vous ne devriez pas avoir besoin de closeInput() .

Nous vous suggérons également d'ajouter un saut de ligne à la fin de l'appel à writeUTFBytes(), par exemple :

NP.standardInput.writeUTFBytes("start C:\\Windows\\System32\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll **\n**");

Enfin, je vous recommande d'écouter d'autres événements sur le NativeProcess, j'utilise un bloc de code comme celui-ci :

NP.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStdOutData);
NP.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onStdErrData);
NP.addEventListener(Event.STANDARD_OUTPUT_CLOSE, onStdOutClose);
NP.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, onStdInputProgress);
NP.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
NP.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, onIOError);
NP.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);

avec les fonctions normales de traitement des événements qui tracent au moins ce qu'ils reçoivent.

Bonne chance - je viens de passer quelques heures à affiner NativeProcess avec cmd.exe - c'est difficile. Mais j'ai fini par y arriver et vous y arriverez aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X