1.加載flash組件 一、基本原理及過程 Flash通過ExternalInterface類與容器應(yīng)用程序進(jìn)行通信。為此,ExternalInterface類提供兩個(gè)靜態(tài)屬性和兩個(gè)靜態(tài)方法。 ExternalInterface.call(“函數(shù)名”,[參數(shù)…])方法執(zhí)行容器應(yīng)用程序的代碼,該方法至少需要一個(gè)字符串參數(shù)來指定要調(diào)用的函數(shù)名,其它任何參數(shù)將作為參數(shù)被傳遞給被調(diào)用函數(shù)。在除瀏覽器外的其它容器中,此方法調(diào)用將導(dǎo)致flash player ActiveX控件的flashcall事件發(fā)生。Flash Player 將指定的函數(shù)名及所有參數(shù)序列化為一個(gè) XML 字符串。容器可以在事件對象的 request 屬性中訪問該信息,并用它來確定如何執(zhí)行它自己的代碼。為了將值返回 ActionScript,容器代碼調(diào)用 ActiveX 對象的 SetReturnValue() 方法,并將結(jié)果(序列化為一個(gè) XML 字符串)作為該方法的參數(shù)進(jìn)行傳遞?!陨险詭椭臋n 其基本過程為:flash調(diào)用—>flash自動(dòng)將參數(shù)打包為xml—>將xml傳遞給C# —>C#解析參數(shù)得到函數(shù)名與參數(shù)值—>執(zhí)行C#函數(shù)—>將返回值打包為xml—>將xml文件發(fā)送回flash—>flash自動(dòng)解析xml得到返回值 從容器中調(diào)用 ActionScript 代碼必須執(zhí)行兩項(xiàng)操作:向 ExternalInterface 類注冊函數(shù),然后從容器的代碼調(diào)用它。在運(yùn)行于臺式機(jī)應(yīng)用程序中調(diào)用 ActionScript 函數(shù)時(shí),必須將已注冊的函數(shù)名及所有參數(shù)序列化為一個(gè) XML 格式的字符串。然后,將該 XML 字符串作為一個(gè)參數(shù)來調(diào)用 ActiveX 控件的 CallFunction() 方法,以實(shí)際執(zhí)行該調(diào)用。 其基本過程為:flash中注冊函數(shù)——將要調(diào)用的函數(shù)名、參數(shù)等信息打包為xml—>將xml傳遞到flash中執(zhí)行調(diào)用—>執(zhí)行ActionScript函數(shù)—>flash自動(dòng)將結(jié)果打包為xml—>將結(jié)果xml傳遞回C# —>C#解析xml得到返回值 可見,flash與C#通信是通過特定格式的xml文件進(jìn)行的,因此為了實(shí)現(xiàn)通信,C#必須實(shí)現(xiàn)一下功能:識別該xml格式以得到flash發(fā)送來的信心,將需要傳送給flash的信息打包成flash能識別的xml格式。為了使用方便我們可以設(shè)計(jì)一個(gè)代理類專門負(fù)責(zé)數(shù)據(jù)的解析與打包工作,這樣我們就可以透明的使用該代理類來實(shí)現(xiàn)flash與C#間的互相調(diào)用。 在flash的示例中有一個(gè)IntrovertIM_CSharp項(xiàng)目較好的實(shí)現(xiàn)了代理的編寫,一般情況下,使用該示例中的ExternalInterfaceProxy類足以滿足要求,因此方便起見我也直接采用了該代理類。 該類的使用非常簡單,通過將flash控件作為參數(shù)傳遞給該類的構(gòu)造函數(shù),我們就可以建立一個(gè)給控件的代理,簡單的響應(yīng)代理的ExternalInterfaceCall事件及使用代理類的Call()方法就能實(shí)現(xiàn)與flash通信,中間的數(shù)據(jù)轉(zhuǎn)換工作完全由代理透明的實(shí)現(xiàn),用戶無需關(guān)心。 其它語言及程序課根據(jù)上面原理編寫自己的代理類來實(shí)現(xiàn)數(shù)據(jù)的解析與打包工作。
二、配置vs 第一步C#添加組件 本文對于flash文件嵌入到winForm窗體后,測試對于flash的命令是否能正確獲取其命令對應(yīng)的指令及參數(shù),已及對于兩者交互的方法的demo 一、程序創(chuàng)建 1、 winForm程序需要添加flash控件,用于支持flash文件的播放。
2、 WinForm與flash交互方式
設(shè)置對應(yīng)控件的FSCommand事件的相應(yīng)方法 圖解:
利弊分析:使用A方式FSCommand參數(shù)只能傳遞一個(gè),如果需要傳遞多個(gè)就需要在調(diào)用方(flash中)用字符串組合多個(gè)參數(shù),傳回后被調(diào)用方分解參數(shù),局限性明顯。使用External API可以實(shí)現(xiàn)雙向調(diào)用,傳參與返回值以XML文檔格式傳遞。 圖解: Flash ActionScript 中聲明提供給 hosting application 調(diào)用的回調(diào)函數(shù)import flash.external.ExternalInterface; ExternalInterface.addCallback("setMessage", null, setMessageArgs); .net程序端 1、 Flash控件的CallFunction方法調(diào)用對于的flash提供的方法 2、 Falash控件的FlashCall事件響應(yīng)flash的方法調(diào)用 二、測試結(jié)果 1、FSCommand方式運(yùn)行,查看點(diǎn)擊對于falsh命令出發(fā)的區(qū)域,可以在FSCommand事件的相應(yīng)方法中查看到對應(yīng)事件參數(shù)。 界面以MessageBox顯示參數(shù) 2、Flash Player 8 External API的方式與WinForm交互 運(yùn)行結(jié)果 三、結(jié)論 對于winForm中嵌入的flash,可以正確觸發(fā)對應(yīng)命令,使用FSCommand只能在flash單一參數(shù)傳遞給程序,使用方法調(diào)用則可以傳遞多參數(shù),且可以實(shí)現(xiàn)flash與程序的相互調(diào)用。 附件下載:http://files.cnblogs.com/dirkcloud/FlashCommandTest.rar |
|