AIR uygulamasında yerel işlemlere bağlanma

Adobe AIR 2 ve üstü

Adobe AIR 2 sürümünden itibaren, AIR uygulamaları komut çizgisi yolu ile diğer yerel işlemleri çalıştırabilir ve onlarla iletişim kurabilir. Örneğin, bir AIR uygulaması bir işlemi çalıştırabilir ve standart girdi ve çıktı akışları yolu ile onunla iletişim kurabilir.

Yerel işlemlerle iletişim kurmak için, yerel yükleyici yoluyla yüklenecek bir AIR uygulaması paketleyin. Yerel yükleyicinin dosya türü, oluşturulduğu işletim sistemine özeldir:

  • Mac OS’de bir DMG dosyasıdır.

  • Windows’ta bir EXE dosyasıdır.

  • Linux’ta bir RPM veya DEB paketidir.

Bu uygulamalar, uzantılı masaüstü profil uygulamaları olarak bilinir. ADT kullanarak -package komutunu çağırırken, -target native seçeneğini belirterek yerel bir yükleyici dosyası oluşturabilirsiniz.

Yerel işlem iletişimlerine genel bakış

Uzantılı masaüstü profilindeki bir AIR uygulaması, bir dosyayı komut satırı tarafından başlatılmış gibi çalıştırabilir. Yerel işlemin standart akışlarıyla iletişim kurabilir. Standart akış, standart girdi akışını (stdin), çıktı akışını (stdout) ve standart hata akışını (stderr) içerir.

Not: Uzantılı masaüstü profilindeki uygulamalar, dosyaları ve uygulamaları File.openWithDefaultApplication() yöntemini kullanarak da başlatabilir. Ancak, bu yöntemin kullanılması, AIR uygulamasına standart akışa erişim sağlamaz. Daha fazla bilgi için, bkz. Varsayılan sistem uygulamasıyla dosya açma .

Aşağıdaki kod örneği, uygulama dizinindeki test.exe uygulamasının nasıl başlatılacağını gösterir. Uygulama "hello" argümanını, komut çizgisi argümanı olarak iletir ve işlemin standart çıktı akışına bir olay dinleyicisi ekler:

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

Yerel işlem başlatma ve kapatma

Yerel işlem başlatmak için, aşağıdakileri yapmak üzere bir NativeProcessInfo nesnesi ayarlayın.

  • İmleci başlatmak istediğiniz dosyanın üzerine getirin

  • Başlatıldığında işleme iletmek için komut çizgisi argümanlarını kaydedin (isteğe bağlı)

  • İşlemin çalışma dizinini ayarlayın (isteğe bağlı)

Yerel işlemi başlatmak için, NativeProcessInfo nesnesini, NativeProcess nesnesinin start() yönteminin parametresi olarak iletin.

Örneğin, aşağıdaki kod örneği uygulama dizinindeki test.exe uygulamasının nasıl başlatılacağını gösterir. Uygulama "hello" argümanını iletir ve kullanıcının belgeler dizinini çalışma dizini olarak ayarlar:

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

İşlemi sonlandırmak için, NativeProcess nesnesinin exit() yöntemini çağırın.

Bir dosyanın yüklü uygulamanızda çalıştırılabilir olmasını istiyorsanız, uygulamanızı paketlediğinizde dosya sisteminde çalıştırılabilir durumda olduğundan emin olun. (Mac ve Linux'ta gerekirse, çalıştırılabilir bayrağını ayarlamak için chmod kullanabilirsiniz.)

Yerel işlemle iletişim kurma

AIR uygulaması yerel bir işlem başlattığında, işlemin standart girdi, standart çıktı ve standart hata akışlarıyla iletişim kurabilir.

NativeProcess nesnesinin aşağıdaki özelliklerini kullanarak akışlara veri yazıp okuyabilirsiniz:

  • standardInput —Standart girdi akış verilerine erişimi içerir.

  • standardOutput —Standart çıktı akış verilerine erişim sağlar.

  • standardError —Standart hata akış verilerine erişimi içerir.

Standart girdi akışına yazma

NativeProcess nesnesinin standartInput özelliğinin yazma yöntemini kullanarak standart veri akışına veri yazabilirsiniz. AIR uygulaması işleme veri yazarken, NativeProcess nesnesi standartInputProgress olaylarını gönderir.

Standart girdi akışına yazarken bir hata oluşursa, NativeProcess nesnesi bir ioErrorStandardInput olayı gönderir.

NativeProcess nesnesinin closeInput() yöntemini çağırarak girdi akışını kapatabilirsiniz. Girdi akışı kapandığında, NativeProcess nesnesi bir standartInputClose olayı gönderir.

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

Standart çıktı akışından okuma

Bu özelliğin okuma yöntemlerini kullanarak standart çıktı akışından veri okuyabilirsiniz. AIR uygulaması işlemden çıktı akışı verisi alırken, NativeProcess nesnesi standardOutputData olaylarını gönderir.

Standart çıktı akışında bir hata oluşursa NativeProcess nesnesi bir standardOutputError olayı gönderir.

İşlem, çıktı akışını kapattığı zaman NativeProcess nesnesi standartOutputClose olayını gönderir.

Standart girdi akışından veri okurken, veriyi oluşturulduğu gibi okuduğunuzdan emin olun. Diğer bir deyişle, standardOutputData olayı için bir olay dinleyici ekleyin. standardOutputData olay dinleyicisinde, verileri NativeProcess nesnesinin standardOutput özelliğinden okuyun. Tüm verileri okumak için standardOutputClose olayını veya exit olayını beklemeyin. Yerel işlem veri oluşturduğunda verileri okumazsanız, ara bellek dolabilir veya veriler kaybedilebilir. Dolmuş bir ara bellek, daha fazla veri yazmak istediğinizde yerel işlemin gecikmesine neden olabilir. Ancak, standardOutputData olayı için bir olay dinleyici kaydetmezseniz, ara bellek dolmaz ve işlem gecikmez. Bu durumda, verilere erişemezsiniz.

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

Standart hata akışından okuma

Bu özelliğin okuma yöntemlerini kullanarak standart hata akışından veri okuyabilirsiniz. AIR uygulaması işlemden hata akışı verisi okurken, NativeProcess nesnesi standardErrorData olaylarını gönderir.

Standart hata akışını yazarken bir hata oluşursa, NativeProcess nesnesi bir standardErrorIoError olayı gönderir.

İşlem, hata akışını kapattığı zaman NativeProcess nesnesi bir standartErrorClose olayı gönderir.

Standart hata akışından veri okurken, veriyi oluşturulduğu gibi okuduğunuzdan emin olun. Başka bir deyişle, standardErrorData olayı için bir olay dinleyici ekleyin. standardErrorData olay dinleyicisinde, verileri NativeProcess nesnesinin standardError özelliğinden okuyun. Tüm verileri okumak için standardErrorClose olayını veya exit olayını beklemeyin. Yerel işlem veri oluşturduğunda verileri okumazsanız, ara bellek dolabilir veya veriler kaybedilebilir. Dolmuş bir ara bellek, daha fazla veri yazmak istediğinizde yerel işlemin gecikmesine neden olabilir. Ancak, standardErrorData olayı için bir olay dinleyicisi kaydetmezseniz, ara bellek dolmaz ve işlem gecikmez. Bu durumda, verilere erişemezsiniz.

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

Yerel işlem iletişimi için güvenlik etmenleri

Yerel işlem API'si kullanıcının sistemindeki her çalıştırılabilir öğeyi çalıştırabilir. Komut oluştururken ve çalıştırırken çok dikkatli olun. Çalıştırılacak komutun herhangi bir parçası harici bir kaynaktan gelirse, komutun çalıştırılmasının güvenli bir işlem olduğunu dikkatli bir şekilde doğrulayın. Aynı şekilde, AIR uygulamanız çalışan bir işleme iletilen her veriyi doğrulamalıdır.

Ancak, girdiyi doğrulamak zor olabilir. Bu zorlukları önlemek için, belirli API'leri olan yerel bir uygulama (Windows'ta bir EXE dosyası gibi) yazmak en iyi çözümdür. Bu API’ler yalnızca uygulama tarafından tanımlanan komutları işlemelidir. Örneğin uygulama, standart girdi akışı üzerinden yalnızca sınırlı bir talimat kümesini kabul edebilir.

Windows'taki AIR, .bat dosyalarını doğrudan çalıştırmanıza izin vermez. Komut yorumlayıcı uygulaması (cmd.exe) Windows .bat dosyalarını çalıştırır. Bir .bat dosyası çağırdığınızda, bu komut uygulaması komuta iletilen argümanları başlatılacak ek uygulamalar olarak yorumlayabilir. Argüman dizesine kötü niyetli amaçlarla fazladan karakter eklenmesi cmd.exe uygulamasının zararlı veya güvensiz bir uygulama çalıştırmasına neden olabilir. Örneğin, düzgün bir veri doğrulaması olmadan, AIR uygulamanız myBat.bat myArguments c:/evil.exe uygulamasını çağırabilir. Komut uygulaması toplu işleme dosyanızı çalıştırmanın yanı sıra evil.exe uygulamasını da başlatabilir.