我在尝试访问AS3 .swf文件中的方法时遇到HRESULT E_FAIL
错误,该文件在Winform中作为AxShockwaveFlashObject组件运行。
flash组件可以通过Externalinterface与C#进行通信,但到目前为止,从C#发送到Flash是不可能的。
这个错误似乎是通用的,毫无意义,因为我发现了许多未解决的问题。不过,我会尝试这个特定场景:
C#
String method = "<invoke name=\"NewFilename\" returntype=\"xml\"></invoke><arguments></arguments>";
mainFlashControl.CallFunction(method);
AS3
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
if (ExternalInterface.available)
{
ExternalInterface.addCallback("NewFilename", NewFilename);
}
}
public function NewFilename():void
{
// Do Something...
}
更新:所有我been able to find是一种解决方法,通过拨打电话(从AS3到C#)并读取响应来检查等待调用的任何函数的每个时间间隔。但是,我也无法得到任何返回的回复。我使用了flashComponent.setResponseValue("test");
,在flash端,Externalinterface.Call()总是返回null。
更新:我现在也调查了FSCommand,也从AS3到C#工作,但似乎没有任何方法可以将返回值附加到它...
答案 0 :(得分:1)
让它发挥作用。我想它需要一个工作的论据:
<强> C#强>
String method = "<invoke name=\"NewFilename\" returntype=\"xml\"><arguments><string>"+sfd.FileName+"</string></arguments></invoke>";
mainFlashControl.CallFunction(method);
<强> AS3 强>
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_mainState = new MainState();
addChild(_mainState);
_editState = new EditState();
addChild(_editState);
_selectKeyState = new SelectKeyState();
addChild(_selectKeyState);
if (ExternalInterface.available)
{
ExternalInterface.addCallback ("NewFilename",NewFilename);
}
}
public function NewFilename(s:String):Boolean
{
_mainState.visible = false;
var th:TextHandle = new TextHandle(s, 100);
th.y = 200;
this.addChild(th);
return true;
}