Flex3 / Air 2: NativeProcess не принимает стандартные входные данные (Ошибка № 2044 и № 3218) - PullRequest
4 голосов
/ 04 мая 2010

Я пытаюсь открыть cmd.exe в новом процессе и передать некоторый код, чтобы программно извлечь устройство; но при попытке сделать это все, что я получаю:

"Ошибка # 2044: необработанное IOErrorEvent :. text = Ошибка # 3218: Ошибка при записи данных в NativeProcess.standardInput."

Вот мой код:

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

Я также пытался использовать writeUTF вместо writeUTFBytes, но все равно получаю ошибку. У кого-нибудь есть представление о том, что я делаю неправильно?

Спасибо за ваше время :) Эдвард.

Ответы [ 3 ]

2 голосов
/ 16 мая 2010

Попробуйте без последней строки "NP.closeInput ();"

Смотри также:

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

2 голосов
/ 13 мая 2010

Может быть, cmd.exe не обрабатывает стандартный ввод как обычный процесс.

Вы можете попробовать передать то, что вы хотите выполнить в качестве параметров, процессу cmd вместо записи в стандартный ввод

Я думаю

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

- это формат для передачи чего-либо в качестве параметра в cmd для немедленного выполнения.

На этом сайте есть пример передачи параметров процесса с использованием строкового вектора:

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

1 голос
/ 25 августа 2010

Я согласен с abudaan, вам не нужно closeInput().

Также предложите добавить разрыв строки в конце вызова writeUTFBytes (), например ::1004*

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

Наконец, я рекомендую вам прослушать другие события в NativeProcess, я использую блок кода примерно так:

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

с обычными функциями-обработчиками событий, которые как минимум отслеживают то, что они получают.

Удачи - я только что потратил несколько часов на доработку NativeProcess с помощью cmd.exe - это круто. Но я попал туда в конце, и вы тоже.

...