views:

488

answers:

3

Hi:

I'm trying to open cmd.exe on a new process and pass some code to programatically eject a device; but when trying to do this all I get is:

"Error #2044: Unhandled IOErrorEvent:. text=Error #3218: Error while writing data to NativeProcess.standardInput."

Here's my 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();
    }

I also tried with writeUTF instead of writeUTFBytes, but I still get the error. Does anyone have an idea of what I'm doing wrong?.

Thanks for your time :) Edward.

A: 

Maybe cmd.exe doesn't handle standardInput like a normal process.

You could try passing what you want to execute as parameters to the cmd process, rather than writing to the standard input

I think

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

is the format to pass something as a parameter to cmd to execute immediately.

This site has an example of passing process parameters using a string vector:

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

Ben
Ok, A really helpfull answer. Thank you :)
Edward
A: 

Try it without the last line "NP.closeInput();"

See also:

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

abudaan
A: 

I agree with abudaan, you shouldn't need to closeInput().

Also, suggest you add a line break at the end of the writeUTFBytes() call, e.g.

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

Lastly, I recommend you listen to other events on the NativeProcess, I use a block of code something like this

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

with the normal event handler functions that at least trace what they receive.

Best of luck - I've just spent a few hours refining NativeProcess with cmd.exe - its fiddly. But I got there in the end and you will too.

Adrian Parker