C# / ActionScript 与 AxShockwaveFlash

C# / ActionScript with AxShockwaveFlash

我是 ActionScript 的新手,正在尝试在 AS 和 C# 之间进行通信。我发现的每个 tutorial/explanation 似乎都完全相同,但我就是无法让它工作。 callFunction 抛出 COM 异常 ("E_FAIL"),当我尝试从 AS 调用 ExternalInterface.call() 时,它似乎从来没有。

我已经在 JavaScript/HTML 中使用它,但我对 C# 没有想法;我怀疑我正在做一些 wrong/not 在我的 AS 中允许的事情。我用 Adob​​e Flex 4.6 和 mxmlc 编译 AS 文件。

编辑:澄清一下,这段代码只显示了从 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;
}

我发现了问题。

1) 正如我所怀疑的,COM 对象需要某种图形初始化才能工作。让你的 main class extend Sprite 解决这个问题。

2) 您显然不能在主 class' 构造函数中直接使用 ExternalInterface.call()ExternalInterface.setCallback()。在主 class' 构造函数中创建一个新 class 的实例,并在其构造函数或任何其他函数中调用 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");
        }
    }
}

我也知道为什么有人会对我的问题投反对票...