首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# / ActionScript与AxShockwaveFlash

C# / ActionScript与AxShockwaveFlash
EN

Stack Overflow用户
提问于 2015-11-23 06:14:23
回答 1查看 1.4K关注 0票数 2

我是ActionScript的新手,我正试图在AS和C#之间进行通信。我发现的每一个教程/解释似乎都是完全相同的,但我根本无法让它发挥作用。callFunction抛出一个COM异常("E_FAIL"),当我尝试从AS调用ExternalInterface.call()时,它似乎从未出现过。

我已经让它在JavaScript/HTML中工作了,但是我对C#没有什么想法;我怀疑我做错了什么/在我的AS中不允许这样做。我用Adobe 4.6和mxmlc编译AS文件。

编辑:为了澄清,这段代码只显示了调用C#函数的测试,因为它似乎不太容易出错(不需要xml参数处理)。另外,我在AS中使用while(true) ExternalInterface.call("someFct", "Hello world");循环运行了一个测试,我的调试过程的CPU使用与as中没有指令的情况基本相同(~0.3%)。因此,这段代码似乎根本不执行。

这是我的AS文件:

代码语言:javascript
复制
package
{
    import flash.external.ExternalInterface;
    public class Test
    {     
        public function Test()
        {
            ExternalInterface.call("someFct", "Hello world");
        }
    }
}

在C#中,我在WinForms中有一个AxShockwaveFlash控件:

代码语言:javascript
复制
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对象并接收其调用:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 04:55:21

我发现了问题。

1)正如我所怀疑的,COM对象需要某种图形初始化才能工作。让您的主类扩展Sprite解决了这个问题。

2)显然不能在主类的构造函数中直接使用ExternalInterface.call()ExternalInterface.setCallback()。在主类的构造函数中创建一个新类的实例并在其构造函数或任何其他函数中进行ExternalInterface调用解决了这个问题。

Test.as:

代码语言:javascript
复制
package
{
    import flash.display.*;
    public class Test extends Sprite
    {     
        public function Test()
        {
            super();
            var x : Test1 = new Test1();
        }
    }
}

和Test1.as:

代码语言:javascript
复制
package
{   
    import flash.external.ExternalInterface;
    public class Test1
    {
        public function Test1()
        {
            ExternalInterface.call("recv", "Hello world");
        }
    }
}

我也不知道为什么有人会否决我的问题..。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33864706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档