我是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文件:
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;
}发布于 2015-11-24 04:55:21
我发现了问题。
1)正如我所怀疑的,COM对象需要某种图形初始化才能工作。让您的主类扩展Sprite解决了这个问题。
2)显然不能在主类的构造函数中直接使用ExternalInterface.call()或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");
}
}
}我也不知道为什么有人会否决我的问题..。
https://stackoverflow.com/questions/33864706
复制相似问题