Edward
Edward

Reputation: 89

Flex3 / Air 2: NativeProcess doesn't accepts standard input data (Error #2044 & #3218)

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.

Upvotes: 4

Views: 3171

Answers (3)

Adrian Parker
Adrian Parker

Reputation: 441

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.

Upvotes: 1

abudaan
abudaan

Reputation: 291

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

See also:

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

Upvotes: 2

Ben
Ben

Reputation: 21249

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

Upvotes: 2

Related Questions