출처: http://deguls.tistory.com/
FLEX <-> Javascript 통신
보안샌드박스에러가 날땐 Object 태그에 allowScriptAcess 부분 설정을 변경해야 합니다.
HTML : sample.html
<script>
function SendToSWF(value){
document.getElementById("externalcallswf").receive(value);
}
function Receive(value){
document.getElementById("txtData").value = value;
}
</script>
<object id="externalcallswf" classid="clsid:.................>
<param name="무비경로" />
<param name="allowScriptAcess" value="allways" />
..
..
</object>
<script>
function SendToSWF(value){
document.getElementById("externalcallswf").receive(value);
}
function Receive(value){
document.getElementById("txtData").value = value;
}
</script>
<object id="externalcallswf" classid="clsid:.................>
<param name="무비경로" />
<param name="allowScriptAcess" value="allways" />
..
..
</object>
Flex : externalcalls.MXML
<?xml .... ?>
<mx:Application createComplete="initApp()" .....>
<mx:Script>
<![CDATA[
import flash.external.ExternalInterface;
import flash.events.*;
import mx.controls.Alert;
private function initApp():void
{
if(ExternalInterface.available)
{
ExternalInterface.addCallback("receive", receive);
}else{
mx.controls.Alert.show("통신 불가..");
}
}
private function receive(value:String):void{
mx.controls.Alert.show(value);
}
private function sendToHTML(value:String):void{
if(ExternalInterface.available)
{
ExternalInterface.call("Receive", value);
}else{
mx.controls.Alert.show("통신 불가..");
}
}
]]>
</mx:Script>
<?xml .... ?>
<mx:Application createComplete="initApp()" .....>
<mx:Script>
<![CDATA[
import flash.external.ExternalInterface;
import flash.events.*;
import mx.controls.Alert;
private function initApp():void
{
if(ExternalInterface.available)
{
ExternalInterface.addCallback("receive", receive);
}else{
mx.controls.Alert.show("통신 불가..");
}
}
private function receive(value:String):void{
mx.controls.Alert.show(value);
}
private function sendToHTML(value:String):void{
if(ExternalInterface.available)
{
ExternalInterface.call("Receive", value);
}else{
mx.controls.Alert.show("통신 불가..");
}
}
]]>
</mx:Script>
FLEX <-> C# (flex 부분은 상단과 동일 합니다.)
C# 어플리케이션에서 Flex나 Flash로 데이터를 보내거나 받으려면 아래와 같이 XML문서를 사용해야 합니다.
<invoke name="application name">
<arguments>
<string>문자열</string>
<number>숫자형</number>
......
</arguments>
</invoke>
Flash Object 참조방법 (단 플래시 플레이어가 Debug 버젼일 경우 윈폼 디자이너에 로드되지 않습니다.)
1. 참조 -> com -> Shockwave Flash 참조 추가
2. 도구상자 마우스 오른쪽 버튼 항목 선택 -> com 구성요소 -> Shockwave Flash 체크
C# Application
...
// 인보크 메세지 수신 이벤트 등록
this.axFlash.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.axFlash_FlashCall);
...
// SWF로 데이터 전달
private void SendToSWF(string strData, int intData){
string invokeXmlData = "<invoke name=\"TansInformation\"><arguments>";
invokeXmlData += "<string>" + strData + "</string>";
invokeXmlData += "<number>" + intData.ToString() + "</number>";
invokeXmlData += "</arguments></invoke>";
try
{
this.axFlash.CallFunction(invokeXmlData);
}catch{
MessageBox.Show("인보크 메세지 전달 실패 \r\n\r\n" + invokeXmlData);
}
}
// 플래시 전송 이벤트 수신
private void axFlash_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
{
// xml 데이터
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(e.request);
XmlNodeList ArgumentList = XmlDoc.GetElementsByTagName("arguments");
string XmlArguments = "";
for(int i = 0;i<ArgumentList.Count;i++)
{
XmlArguments += ArgumentList[i].InnerText + Environment.NewLine;
}
MessageBox.Show(XmlArguments);
}
...
// 인보크 메세지 수신 이벤트 등록
this.axFlash.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.axFlash_FlashCall);
...
// SWF로 데이터 전달
private void SendToSWF(string strData, int intData){
string invokeXmlData = "<invoke name=\"TansInformation\"><arguments>";
invokeXmlData += "<string>" + strData + "</string>";
invokeXmlData += "<number>" + intData.ToString() + "</number>";
invokeXmlData += "</arguments></invoke>";
try
{
this.axFlash.CallFunction(invokeXmlData);
}catch{
MessageBox.Show("인보크 메세지 전달 실패 \r\n\r\n" + invokeXmlData);
}
}
// 플래시 전송 이벤트 수신
private void axFlash_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
{
// xml 데이터
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(e.request);
XmlNodeList ArgumentList = XmlDoc.GetElementsByTagName("arguments");
string XmlArguments = "";
for(int i = 0;i<ArgumentList.Count;i++)
{
XmlArguments += ArgumentList[i].InnerText + Environment.NewLine;
}
MessageBox.Show(XmlArguments);
}