套件 | flash.desktop |
類別 | public class NativeProcess |
繼承 | NativeProcess EventDispatcher Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
只有使用原生安裝程式 (延伸的桌面描述檔應用程式) 的 AIR 應用程式,才可以使用 NativeProcess 類別以及它的功能。除錯時,您可以將 -profile extendedDesktop
引數傳送至 ADL,來啟用 NativeProcess 功能。在執行階段中,您可以檢查 NativeProcess.isSupported
屬性,判斷是否支援原生處理程序通訊。
AIR 描述檔支援:使用原生安裝程式部署至桌上型電腦作業系統的應用程式支援此項功能。行動裝置或 AIR for TV 裝置不支援此項功能。您可以使用 NativeProcess.isSupported
屬性測試執行階段的支援狀況。如需有關跨多個描述檔之 API 支援的詳細資訊,請參閱 AIR 描述檔支援。
使用原生安裝程式 (延伸的桌面描述檔應用程式) 安裝的 AIR 應用程式也可以使用 File.openWithDefaultApplication
來開啟應用程式。不過,NativeProcess 類別提供直接存取標準輸入、標準輸出以及標準錯誤的管道。
注意:使用 extendedTV
描述檔的 AIR for TV 應用程式,可以使用原生擴充功能執行原生處理程序。同樣地,行動裝置也可以使用原生擴充功能。
更多範例
相關 API 元素
屬性 | 定義自 | ||
---|---|---|---|
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
isSupported : Boolean [靜態] [唯讀]
指出目前的描述檔是否支援執行中的原生處理程序。 | NativeProcess | ||
running : Boolean [唯讀]
指出這個原生處理程序目前是否執行中。 | NativeProcess | ||
standardError : IDataInput [唯讀]
可以從這個原生處理程序存取標準錯誤輸出。 | NativeProcess | ||
standardInput : IDataOutput [唯讀]
可以從這個原生處理程序存取標準輸入。 | NativeProcess | ||
standardOutput : IDataInput [唯讀]
可以從這個原生處理程序存取標準輸出管道。 | NativeProcess |
方法 | 定義自 | ||
---|---|---|---|
建構未初始化的 NativeProcess 物件。 | NativeProcess | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
會在 EventDispatcher 物件註冊事件偵聽程式,以便讓偵聽程式收到事件的通知。 | EventDispatcher | ||
關閉此處理程序中的輸入串流。 | NativeProcess | ||
會將事件傳送到事件流程。 | EventDispatcher | ||
嘗試結束原生處理程序。 | NativeProcess | ||
會檢查 EventDispatcher 物件是否有對特定的事件類型註冊偵聽程式。 | EventDispatcher | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
會從 EventDispatcher 物件移除偵聽程式。 | EventDispatcher | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
開始由特定啟動資訊所指定的原生處理程序。 | NativeProcess | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object | ||
檢查此 EventDispatcher 物件是否已註冊事件偵聽程式,或者此物件的任何祖系已為特定事件類型註冊事件偵聽程式。 | EventDispatcher |
事件 | 摘要 | 定義自 | ||
---|---|---|---|---|
[廣播事件] 當 Flash Player 或 AIR 應用程式取得作業系統焦點並成為作用中時傳送。 | EventDispatcher | |||
[廣播事件] 當 Flash Player 或 AIR 應用程式失去作業系統焦點並成為非作用中時傳送。 | EventDispatcher | |||
發出訊號,說明原生處理程序已經結束。 | NativeProcess | |||
發出訊號,說明 NativeProcess 已經關閉它的錯誤串流。 | NativeProcess | |||
發出訊號,說明原生處理程序在標準錯誤 (stderror) 串流上有可以讀取的資料。 | NativeProcess | |||
發出訊號,說明讀取標準錯誤 (stderror) 串流已經失敗。 | NativeProcess | |||
發出訊號,說明 NativeProcess 物件已經呼叫 closeInput 方法,關閉它的輸入串流。 | NativeProcess | |||
發出訊號,說明寫入標準輸入 (stdin) 串流已經失敗。 | NativeProcess | |||
發出訊號,說明 NativeProcess 已經將資料寫入子處理程序的輸入串流。 | NativeProcess | |||
發出訊號,說明 NativeProcess 已經關閉它的輸出串流。 | NativeProcess | |||
發出訊號,說明原生處理程序在輸出串流上有可以讀取的資料。 | NativeProcess | |||
發出訊號,說明讀取 stdout 串流已經失敗。 | NativeProcess |
isSupported | 屬性 |
running | 屬性 |
standardError | 屬性 |
standardError:IDataInput
[唯讀] 語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
可以從這個原生處理程序存取標準錯誤輸出。只要在這個管道有可以使用的資料,NativeProcess 物件會傳送 ProgressEvent 物件。若在沒有資料時,您嘗試從這個串流讀取資料,則 NativeProcess 物件會擲出 EOFError 異常狀況。
類型為 IDataInput,因為是從目前處理程序輸入資料,即使它是子處理程序的輸出串流。
實作
public function get standardError():IDataInput
擲回值
EOFError — 若資料不存在而且嘗試進行讀取作業。
|
相關 API 元素
standardInput | 屬性 |
standardInput:IDataOutput
[唯讀] 語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
可以從這個原生處理程序存取標準輸入。使用此管道,將資料傳送至此處理程序。每一次將資料寫入 input
屬性後,會儘快將資料寫入原生處理程序的輸入管道。
類型為 IDataOutput,因為是從目前處理程序輸出資料,即使它是子處理程序的輸入串流。
實作
public function get standardInput():IDataOutput
擲回值
IllegalOperationError — 當 running 傳回 false ,或嘗試將資料寫入關閉的輸入串流時,則寫入這個值。
|
相關 API 元素
standardOutput | 屬性 |
standardOutput:IDataInput
[唯讀] 語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
可以從這個原生處理程序存取標準輸出管道。使用這個管道,從原生處理程序的標準輸出讀取資料。當這個管道有可以使用的資料時,NativeProcess 物件會傳送 ProgressEvent 物件。若在沒有資料時,您嘗試從這個串流讀取資料,則 NativeProcess 物件會擲出 EOFError。
類型為 IDataInput,因為是從目前處理程序輸入資料,即使它是子處理程序的輸出串流。
實作
public function get standardOutput():IDataInput
擲回值
EOFError — 若資料不存在而且嘗試進行讀取作業。
|
相關 API 元素
NativeProcess | () | 建構函式 |
public function NativeProcess()
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
建構未初始化的 NativeProcess 物件。呼叫 start()
方法來開始處理程序。
相關 API 元素
closeInput | () | 方法 |
public function closeInput():void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
關閉此處理程序中的輸入串流。某些命令列應用程式會等候輸入串流關閉後才開始某些作業。當串流關閉後,要等到處理程序結束並重新開始後,才可以重新開啟串流。
事件
ioErrorStandardInput: — 關閉處理程序的輸入串流時發生問題。
| |
standardInputClose: — 輸入串流已經關閉。
|
exit | () | 方法 |
public function exit(force:Boolean = false):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
嘗試結束原生處理程序。
參數
force:Boolean (default = false ) — 應用程式是否應該在需要時嘗試強制結束原生處理程序。
若 若 若 NativeProcess 未成功結束,它會傳送 |
start | () | 方法 |
public function start(info:NativeProcessStartupInfo):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
開始由特定啟動資訊所指定的原生處理程序。處理程序啟動之後,就會開啟所有輸入和輸出串流。此方法會在要求作業系統啟動指定的處理程序之後立即傳回。若處理程序目前執行中,則 NativeProcess 物件會擲出 IllegalOperationError
異常狀況。若 NativeProcess 物件的 running
屬性傳回 true
,則此處理程序正在執行中。若作業系統無法啟動處理程序,就會擲出 Error
。
NativeProcess 實體是對應至相關作業系統的單一處理程序。若您想在同時執行數個相同的作業系統處理程序,可以為每一個子處理程序建立一個 NativeProcess 個體。
只要 NativeProcess 物件的 running
屬性傳回 false
,就可以隨時呼叫此方法。這表示 NativeProcess 物件可以重複使用。換言之,您可以建構一個 NativeProcess 執行處理,呼叫 start()
方法,等候 exit
事件,然後再次呼叫 start()
方法。您可以使用不同的 NativeProcessStartupInfo 物件做為後續呼叫 start()
方法的 info
參數值。
只有使用原生安裝程式的 AIR 應用程式,才可以使用 NativeProcess 類別以及它的功能。除錯時,您可以將 -profile extendedDesktop
引數傳送至 ADL,來啟用 NativeProcess 功能。檢查 NativeProcess.isSupported
屬性,判斷是否支援原生處理程序通訊。
重要安全性注意事項:
原生處理程序 API 可以在使用者的系統上執行任何執行檔。建構以及執行命令時請務必小心。如果要執行之命令的任何部分是從外部來源產生的,請仔細驗證命令是否可以放心執行。否則,您的 AIR 應用程式應該會驗證傳送至運行中執行程序的資料。
不過,驗證輸入實屬不易。若要避免類似的困難,最好是編寫一個擁有特定 API 的原生應用程式 (例如 Windows 上的 EXE)。這些 API 應該只處理 AIR 應用程式特別需要的命令。例如,原生應用程式只會透過標準輸入串流來接受有限的指令集。
Windows 上的 AIR 不允許直接執行 .bat 檔案。命令解譯器應用程式 (cmd.exe) 會執行Windows .bat 檔案。呼叫 .bat 檔案時,當其他應用程式啟動時,這個命令應用程式可以解譯傳送至命令的引數。引數字串中外部字元的惡意插入,會造成 cmd.exe 執行有害或不安全的應用程式。例如,沒有適當的資料驗證,您的 AIR 應用程式會呼叫 myBat.bat myArguments c:/evil.exe
。除了執行您的批次檔之外,這個命令應用程式會啟動 evil.exe 應用程式。
如果您使用 .bat 檔案來呼叫 start()
方法,NativeProcess 物件會擲回例外。Error 物件的 message
屬性包含「錯誤 #3219:無法啟動 NativeProcess」字串。
參數
info:NativeProcessStartupInfo — NativeProcessStartupInfo 會定義原生處理程序的啟動方法。
|
擲回值
IllegalOperationError — 若 NativeProcess 目前執行中。
| |
ArgumentError — 若 NativeProcessStartupInfo 的 nativePath 屬性不存在。
| |
Error — 若 NativeProcess 未成功啟動。
|
相關 API 元素
exit | 事件 |
flash.events.NativeProcessExitEvent
屬性 NativeProcessExitEvent.type =
flash.events.NativeProcessExitEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明原生處理程序已經結束。exitCode
屬性包含處理程序在結束時傳回至主機作業系統的值。如果 AIR 應用程式是呼叫 NativeProcess 物件的 exit()
方法來終止處理程序,則 exitCode
屬性會設定為 NaN。
standardErrorClose | 事件 |
flash.events.Event
屬性 Event.type =
flash.events.Event
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明 NativeProcess 已經關閉它的錯誤串流。
standardErrorData | 事件 |
flash.events.ProgressEvent
屬性 ProgressEvent.type =
flash.events.ProgressEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明原生處理程序在標準錯誤 (stderror) 串流上有可以讀取的資料。當子處理程序清除它的標準錯誤串流,或者用於在處理程序之間通訊的內部緩衝區已滿時,NativeProcess 物件就會傳送此事件。不要撰寫依賴此內部緩衝區大小的程式碼;它在各種版本和作業系統之間會所有不同。
standardErrorIoError | 事件 |
flash.events.IOErrorEvent
屬性 IOErrorEvent.type =
flash.events.IOErrorEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明讀取標準錯誤 (stderror) 串流已經失敗。當執行階段無法從原生處理程序的標準錯誤管道讀取資料時,NativeProcess 物件可以傳送這個事件。
standardInputClose | 事件 |
flash.events.Event
屬性 Event.type =
flash.events.Event
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明 NativeProcess 物件已經呼叫 closeInput
方法,關閉它的輸入串流。當實際原生處理程序自己關閉輸入串流時,NativeProcess 物件並不會發出此事件。
standardInputIoError | 事件 |
flash.events.IOErrorEvent
屬性 IOErrorEvent.type =
flash.events.IOErrorEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明寫入標準輸入 (stdin) 串流已經失敗。當 closeInput()
方法失敗,或者當執行階段無法將資料寫入原生處理程序的標準輸入管道,NativeProcess 物件就會發出此事件。
standardInputProgress | 事件 |
flash.events.ProgressEvent
屬性 ProgressEvent.type =
flash.events.ProgressEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明 NativeProcess 已經將資料寫入子處理程序的輸入串流。當資料寫入串流後,NativeProcess 物件會送出這個事件。此事件「不會」指出子處理程序是否讀取任何資料。
standardOutputClose | 事件 |
flash.events.Event
屬性 Event.type =
flash.events.Event
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明 NativeProcess 已經關閉它的輸出串流。
standardOutputData | 事件 |
flash.events.ProgressEvent
屬性 ProgressEvent.type =
flash.events.ProgressEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明原生處理程序在輸出串流上有可以讀取的資料。當子處理程序清除它的 stdout 串流,或者用於在處理程序之間通訊的內部緩衝區已滿時,NativeProcess 物件就會傳送此事件。不要撰寫依賴此內部緩衝區大小的程式碼;它在各種版本和作業系統之間會所有不同。
standardOutputIoError | 事件 |
flash.events.IOErrorEvent
屬性 IOErrorEvent.type =
flash.events.IOErrorEvent
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
發出訊號,說明讀取 stdout 串流已經失敗。當執行階段無法從原生處理程序的標準輸出管道讀取資料時,NativeProcess 物件可以傳送這個事件。
package { import flash.display.Sprite; import flash.desktop.NativeProcess; import flash.desktop.NativeProcessStartupInfo; import flash.events.Event; import flash.events.ProgressEvent; import flash.events.IOErrorEvent; import flash.events.NativeProcessExitEvent; import flash.filesystem.File; public class NativeProcessExample extends Sprite { public var process:NativeProcess; public function NativeProcessExample() { if(NativeProcess.isSupported) { setupAndLaunch(); } else { trace("NativeProcess not supported."); } } public function setupAndLaunch():void { var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); var file:File = File.applicationDirectory.resolvePath("test.py"); nativeProcessStartupInfo.executable = file; var processArgs:Vector.<String> = new Vector.<String>(); processArgs[0] = "foo"; nativeProcessStartupInfo.arguments = processArgs; process = new NativeProcess(); process.start(nativeProcessStartupInfo); process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData); process.addEventListener(NativeProcessExitEvent.EXIT, onExit); process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError); process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError); } public function onOutputData(event:ProgressEvent):void { trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable)); } public function onErrorData(event:ProgressEvent):void { trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); } public function onExit(event:NativeProcessExitEvent):void { trace("Process exited with ", event.exitCode); } public function onIOError(event:IOErrorEvent):void { trace(event.toString()); } } }
#!/usr/bin/python
# ------------------------------------------------------------------------------
# Sample Python script
# ------------------------------------------------------------------------------
import sys
for word in sys.argv: #echo the command line arguments
print word
print "HI FROM PYTHON"
print "Enter user name"
line = sys.stdin.readline()
sys.stdout.write("hello," + line)
Tue Jun 12 2018, 03:47 PM Z