2

私は ActionScript を初めて使用し、AS と C# の間で通信しようとしています。私が見つけたすべてのチュートリアル/説明はまったく同じように見えますが、それを機能させることはできません. callFunctionCOM 例外 ("E_FAIL") をスローExternalInterface.call()し、AS から呼び出しようとしても、決してそうではないようです。

これは JavaScript/HTML で動作するようになりましたが、C# のアイデアがありません。私は自分の AS で何か間違ったことをしている/許可されていないのではないかと疑っています。AS ファイルを Adob​​e Flex 4.6 と mxmlc でコンパイルします。

編集: 明確にするために、このコードは AS から C# 関数を呼び出すテストのみを示しています。これは、エラーが発生しにくいように思われるためです (xml 引数の処理は必要ありません)。また、AS でループを使用してテストを実行しましたがwhile(true) ExternalInterface.call("someFct", "Hello world");、デバッグ プロセスの CPU 使用率は、AS に命令がない場合と基本的に同じです (~0.3%)。したがって、コードはまったく実行されないようです。

これが私のASファイルです:

package
{
    import flash.external.ExternalInterface;
    public class Test
    {     
        public function Test()
        {
            ExternalInterface.call("someFct", "Hello world");
        }
    }
}

C# では、WinForms に AxShockwaveFlash コントロールがあります。

private void InitializeComponent()
{
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
    this.axShockwaveFlash1 = new AxShockwaveFlashObjects.AxShockwaveFlash();
    ((System.ComponentModel.ISupportInitialize)(this.axShockwaveFlash1)).BeginInit();
    this.SuspendLayout();
    // 
    // axShockwaveFlash1
    // 
    this.axShockwaveFlash1.Enabled = true;
    this.axShockwaveFlash1.Location = new System.Drawing.Point(104, 67);
    this.axShockwaveFlash1.Name = "axShockwaveFlash1";
    this.axShockwaveFlash1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axShockwaveFlash1.OcxState")));
    this.axShockwaveFlash1.Size = new System.Drawing.Size(574, 314);
    this.axShockwaveFlash1.TabIndex = 0;
    this.axShockwaveFlash1.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.recv);
    this.Click += new System.EventHandler(this.Form1_Click);
//...
    ((System.ComponentModel.ISupportInitialize)(this.axShockwaveFlash1)).EndInit();
     this.ResumeLayout(false);
}

SWF オブジェクトを初期化し、その呼び出しを受け取る:

private void Form1_Click(object sender, EventArgs e)
{
    axShockwaveFlash1.LoadMovie(0, @"mypath\test.swf");
}

//Never executes
public void recv(object sender, _IShockwaveFlashEvents_FlashCallEvent e)
{
    string s = e.request;
}
4

1 に答える 1

3

私は問題を見つけました。

1) 私が疑ったように、COM オブジェクトが機能するためには、ある種のグラフィックの初期化が必要です。メインクラスを拡張すると、これがSprite解決します。

2)メインクラスのコンストラクターでExternalInterface.call()orを直接使用することはできないようです。ExternalInterface.setCallback()メインクラスのコンストラクターで新しいクラスのインスタンスを作成し、ExternalInterfaceそのコンストラクターまたはその他の関数で呼び出しを行うと、これが解決されます。

Test.as:

package
{
    import flash.display.*;
    public class Test extends Sprite
    {     
        public function Test()
        {
            super();
            var x : Test1 = new Test1();
        }
    }
}

そして Test1.as:

package
{   
    import flash.external.ExternalInterface;
    public class Test1
    {
        public function Test1()
        {
            ExternalInterface.call("recv", "Hello world");
        }
    }
}

また、誰かが私の質問に反対票を投じる理由もわかりません...

于 2015-11-24T04:55:21.527 に答える