Связь с собственными процессами в AIR

Adobe AIR 2 и более поздних версий

Начиная с версии Adobe AIR 2, приложения AIR могут выполняться и связываться с другими собственными процессами с помощью командной строки. Например, приложение AIR может выполнить процесс и связаться с ним с помощью стандартных потоков ввода и вывода.

Для обмена данными с встроенными процессами упакуйте подлежащее установке приложение AIR с помощью собственной программы установки. Тип файла собственной программы установки зависит от операционной системы, для которой она создается:

  • DMG-файл в ОС Mac OS.

  • EXE-файл в ОС Windows.

  • Пакет RPM или DEB в ОС Linux.

Такие приложения называются приложениями расширенного профиля рабочего стола. Собственную программу по установке можно создать, указав параметр -target native при вызове команды -package с помощью ADT.

Обзор связей с собственным процессом

Приложение AIR в расширенном профиле рабочего стола может выполнять файл, как если бы он был вызван из командной строки. Оно может обмениваться данными со стандартными потоками собственного процесса. Стандартные потоки включают стандартный поток ввода (stdin), поток вывода (stdout) и стандартный поток ошибок (stderr).

Примечание. Приложения в расширенном профиле рабочего стола могут также запускать файлы и приложения с помощью метода File.openWithDefaultApplication() . Однако использование этого метода не дает приложению AIR доступ к стандартным потокам. Дополнительные сведения см. в разделе « Открытие файлов с помощью выбранной по умолчанию системной программы »

В следующем примере кода показано, как запускается программа test.exe в каталоге приложений. Эта программа передает аргумент "hello" как аргумент командной строки и добавляет прослушиватель событий к стандартному потоку вывода процесса:

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
var file:File = File.applicationDirectory.resolvePath("test.exe"); 
nativeProcessStartupInfo.executable = file; 
var processArgs:Vector.<String> = new Vector.<String>(); 
processArgs.push("hello"); 
nativeProcessStartupInfo.arguments = processArgs; 
process = new NativeProcess(); 
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); 
process.start(nativeProcessStartupInfo); 
public function onOutputData(event:ProgressEvent):void 
{ 
    var stdOut:ByteArray = process.standardOutput; 
    var data:String = stdOut.readUTFBytes(process.standardOutput.bytesAvailable); 
    trace("Got: ", data); 
}

Запуск и закрытие собственного процесса

Чтобы запустить собственный процесс, настройте объект NativeProcessInfo, чтобы он выполнял следующее:

  • указывал на файл, который требуется запустить;

  • сохранял аргументы командной строки для передачи процессу при запуске (необязательно)

  • задавал рабочий каталог процесса (необязательно).

Чтобы запустить собственный процесс, передайте объект NativeProcessInfo в качестве параметра метода start() для объекта NativeProcess.

Например, в следующем коде показано, как запускается программа test.exe в каталоге приложений. Приложение передает аргумент "hello" и выбирает каталог документов пользователя в качестве рабочего:

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
var file:File = File.applicationDirectory.resolvePath("test.exe"); 
nativeProcessStartupInfo.executable = file; 
var processArgs:Vector.<String> = new Vector.<String>(); 
processArgs[0] = "hello"; 
nativeProcessStartupInfo.arguments = processArgs; 
nativeProcessStartupInfo.workingDirectory = File.documentsDirectory; 
process = new NativeProcess(); 
process.start(nativeProcessStartupInfo); 

Чтобы завершить этот процесс, вызовите метод exit() объекта NativeProcess.

Если необходимо, чтобы файл в установленном приложении являлся исполняемым, то при создании пакета приложения убедитесь, что он является исполняемым в данной файловой системе. (В ОС Mac и Linux для установки флага executable можно использовать команду chmod.)

Связь с собственным процессом

После того как приложение AIR запустило собственный процесс, оно может связаться со стандартными потоками ввода, вывода и ошибок процесса.

Чтение и запись данных в потоки выполняется с помощью следующих свойств объекта NativeProcess:

  • standardInput — содержит доступ к данным стандартного потока ввода.

  • standardOutput — содержит доступ к данным стандартного потока вывода.

  • standardError — содержит доступ к данным стандартного потока ошибок.

Запись в стандартный поток ввода

Записать данные в стандартный поток ввода можно с помощью методов записи для свойства standardInput объекта NativeProcess. По мере того как приложение AIR записывает данные в процесс, объект NativeProcess отправляет события standardInputProgress .

Если происходит ошибка при записи в стандартный поток ввода, объект NativeProcess отправляет событие ioErrorStandardInput .

Поток ввода можно закрыть, вызвав метод closeInput() объекта NativeProcess. Когда поток ввода закрывается, объект NativeProcess отправляет событие standardInputClose .

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
var file:File = File.applicationDirectory.resolvePath("test.exe"); 
nativeProcessStartupInfo.executable = file; 
process = new NativeProcess(); 
process.start(nativeProcessStartupInfo); 
process.standardInput.writeUTF("foo"); 
if(process.running) 
{ 
    process.closeInput(); 
}

Чтение из стандартного потока вывода

Данные можно считать из стандартного потока вывода с помощью методов чтения этого свойства. По мере того как приложение AIR получает данные потока вывода из процесса, объект NativeProcess отправляет события standardOutputData .

Если происходит ошибка при записи в стандартный поток вывода, объект NativeProcess отправляет событие standardOutputError .

Когда процесс закрывает поток вывода, объект NativeProcess отправляет событие standardOutputClose .

При чтении данных из стандартного потока ввода убедитесь, что данные читаются в порядке их создания. Другими словами, добавьте прослушиватель событий для события standardOutputData . В прослушивателе событий standardOutputData прочитайте данные из свойства standardOutput объекта NativeProcess. Для чтения всех данных не дожидайтесь появления события standardOutputClose или exit . Если данные не читаются по мере их создания собственным процессом, буфер может заполниться или данные могут быть потеряны. Заполненный буфер может стать причиной остановки собственного процесса при попытке записи дополнительных данных. Однако, если прослушиватель событий не зарегистрирован для события standardOutputData , буфер не будет заполняться и процесс не будет останавливаться. В этом случае доступ к данным будет отсутствовать.

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
var file:File = File.applicationDirectory.resolvePath("test.exe"); 
nativeProcessStartupInfo.executable = file; 
process = new NativeProcess(); 
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, dataHandler); 
process.start(nativeProcessStartupInfo); 
var bytes:ByteArray = new ByteArray(); 
function dataHandler(event:ProgressEvent):void 
{ 
    bytes.writeBytes(process.standardOutput.readBytes(process.standardOutput.bytesAvailable); 
}

Чтение из стандартного потока ошибок

Данные можно считать из стандартного потока ошибок с помощью методов чтения этого свойства. Поскольку приложение AIR считывает данные потока вывода из процесса, объект NativeProcess отправляет события standardErrorData .

Если происходит ошибка при записи в стандартный поток ошибок, объект NativeProcess отправляет событие standardErrorIoError .

Когда процесс закрывает поток ошибок, объект NativeProcess отправляет событие standardErrorClose.

При чтении данных из стандартного потока ошибок убедитесь, что данные читаются в порядке их создания. Другими словами, добавьте прослушиватель событий для события standardErrorData . В прослушивателе событий standardErrorData прочитайте данные из свойства standardError объекта NativeProcess. Для чтения всех данных не дожидайтесь появления события standardErrorClose или exit . Если данные не читаются по мере их создания собственным процессом, буфер может заполниться или данные могут быть потеряны. Заполненный буфер может стать причиной остановки собственного процесса при попытке записи дополнительных данных. Однако, если прослушиватель событий не зарегистрирован для события standardErrorData , буфер не будет заполняться и процесс не будет останавливаться. В этом случае доступ к данным будет отсутствовать.

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
var file:File = File.applicationDirectory.resolvePath("test.exe"); 
nativeProcessStartupInfo.executable = file; 
process = new NativeProcess(); 
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, errorDataHandler); 
process.start(nativeProcessStartupInfo); 
var errorBytes:ByteArray = new ByteArray(); 
function errorDataHandler(event:ProgressEvent):void 
{ 
    bytes.writeBytes(process.standardError.readBytes(process.standardError.bytesAvailable); 
}

Вопросы безопасности при связи с собственным процессом

В API-интерфейсе исходного процесса можно запускать любые исполняемые файлы в системе пользователя. Соблюдайте крайнюю осторожность при создании и выполнении команд. Если любая часть используемой команды исходит от внешнего источника, тщательно проанализируйте безопасность выполнения такой команды. Подобным образом, приложение AIR должно проверять все данные, передаваемые запущенному процессу.

Однако проверка ввода может представлять определенную трудность. Чтобы избежать таких трудностей, лучше написать собственное приложение (например, EXE-файл в ОС Windows), со специальными API-интерфейсами. Эти API-интерфейсы должны обрабатывать только те команды, которые заданы приложением. К примеру, приложения могут принимать только ограниченный набор инструкций посредствам стандартного потока ввода.

Среда выполнения AIR в ОС Windows не разрешает непосредственное выполнение файлов .bat. Приложение интерпретатора команд (cmd.exe) выполняет файлы .bat ОС Windows. При вызове файла .bat это приложение интерпретирует аргументы, передаваемые команде, как дополнительные приложения, которые требуется запустить. Вредоносная вставка лишних символов в строку аргумента может привести к выполнению приложением cmd.exe вредоносного или небезопасного приложения. Например, без надлежащей проверки данных приложение AIR может вызвать myBat.bat myArguments c:/evil.exe . В результате этого приложение cmd.exe вместе с файлом .bat запустит приложение evil.exe.