1

HRESULT E_FAILWinform 内で AxShockwaveFlashObject コンポーネントとして実行されている AS3 .swf ファイルのメソッドにアクセスしようとすると、エラーが発生します。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...
}

更新:私が見つけることができたのは、(AS3 から C# への) 呼び出しを行い、応答を読み取ることによって、呼び出されるのを待っている関数を時間間隔ごとにチェックする回避策だけです。ただし、何も返すための応答も得られません。私が使用flashComponent.setResponseValue("test");したフラッシュ側では、Externalinterface.Call() は常に null を返します。

更新: FSCommand も調べました。AS3 から C# でも動作しますが、戻り値をそれにアタッチする方法もないようです...

4

1 に答える 1

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;
    }
于 2012-12-05T04:22:58.030 に答える