功能:Flash與其它容器進行互動
flash ActionScript提供的外部訪問接口,用於Flash虛擬機與ActiveX 容器(ActiveX container))應用程式或 容器應用程式 (Container application)通信。接口定義addCallback()及call()兩個方法及一個屬性available。
用法:
因為在Flash幫助中已詳細說明了Flash與JavaScript容器之間的通信過程,此處不贅述。現以在含有Flash控制項的VS(VC)應用程式為例說明:
容器訪問Flash控制項:
A:flash代碼:
//導入import flash.external.ExternalInterface;//回調聲明if (flash.external.ExternalInterface.available){ExternalInterface.addCallback("flashDoSth", null, flashDoSth);}//回調定義function flashDoSth(param:TYPE):TYPE{//do sth here;//return sth;}
B:VS(VC)代碼:
在需要FLASH執行上述定義的函式代碼段,寫入
m_flash.CallFunction(strXML);
//說明:
m_flash即Flash控制項變數;
strXML即為容器傳向Flash的數據,為XML類型字元串,在JS網頁中,數據直接傳輸使用,但在控制項容器如VS(VC)中,容器與控制項數據傳方式為:數據(VS/VC)----XML數據---數據(Flash)。
一般的組織方式:
容器向Flash傳遞數據為字元串"STR",strXML應該寫為:
"<invoke name="flashDoSth" returntype="xml"><arguments><string>STR</string></arguments></invoke>"
容器向Flash傳遞數據為數字222,strXML應該寫為:
"<invoke name="flashDoSth" returntype="xml"><arguments><number>222</number></arguments></invoke>"
容器向Flash傳遞數據為布爾,strXML應該寫為(以下方式之一):
"<invoke name="flashDoSth" returntype="xml"><arguments><true/></arguments></invoke>""<invoke name="flashDoSth" returntype="xml"><arguments><false/></arguments></invoke>"
當然,以上這種寫法麻煩,現在網上有tinyxml,用起來很方便。可利用tynyxml封裝了一個類,用來VS(VC)向Flash傳遞數據或解析來自Flash的XML數據,包括稍複雜的數據,如數組(一維)、結構體等。大家如果經常用到數據傳輸,最好是封裝,不然太麻煩,且數據量太少。
Flash訪問容器:
A:flash代碼:
//導入import flash.external.ExternalInterface;//向VS(VC)提出調用請求:if (flash.external.ExternalInterface.available){if (String(ExternalInterface.call("itemType", 數據)) != "OK") {//容器收到成功後,此處繼續其它處理}}
//說明:上述代碼中“數據”可以為Flash中任意數據類型,包括Object.
"itemType"用於在容器程式OnFlashCall..()中判別來自於Flash中不同的請求。
B:VS(VC)中代碼:
同樣,容器中將收到的數據為XML格式,並且只能通過FlashCall事件進行接收;
//假設VC接收到flash傳送的一個XML字元串:
<invoke name="jsfunction1"returntype="xml"><arguments><string>true</string></arguments></invoke>
FlashCallShockwaveflash1(LPCTSTR request){//下列代碼使用了TinyXML開源庫,用來解析讀取name的值TiXmlDocument *doc = new TiXmlDocument();doc->Parse(request);if (&doc == NULL) AfxMessageBox("Hello1");TiXmlElement * root = doc->RootElement(); CString element = root->Attribute("name");}
得到值:jsfunction1
更詳細請看參考資料