尝试从C#调用AS3中的方法时获取HRESULT E_FAIL

时间:2012-12-05 03:16:46

标签: c# actionscript-3 com-interop

我在尝试访问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#工作,但似乎没有任何方法可以将返回值附加到它...

1 个答案:

答案 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;
    }