C#和Flash通信(C# and Flash communication)

2019-08-03 04:04发布

有没有办法为C#得到的SWF通过ExternaInterface公开的方法列表?

Answer 1:

更新:

只是意识到我误读为你正在寻找通过Flex的定义方法,你的问题ExternalInterface class ,而不是那些的Shockwave ActiveX control本身; 我要保持我的下面,因为它可能仍然是有用的关于原来的答案SWF通过C#的使用一般。

关于ExternalInterface我不知道答案的权利,但你可能会考虑乐趣与C#和Flash Player 8外部API ,以获取有关如何在第一时间通过C#使用这个API的想法。 (另一个有用的样本可能是Flash 8中的Python和C#应用程序使用外部接口 )。

从什么我读了前文中有可能没有直接的解决方案,并通过经过精雕细琢的调用约定XML片段到CallFunction()是有点奇特,但你仍应该能够翻译乔治的解决方案 ,原则上这个(我说,它很可能不会是漂亮;)

祝好运!


如何通过COM互操作从.NET访问SWF:

SWF的Windows通过的方式实现的Adobe Flash Player ActiveX控件 ,因此你将通过使用它从.NET COM互操作性 。

你可以找到一个(传统)文/样品与本上Adobe的网站,看到嵌入的Macromedia Flash Player在C#应用程序来显示股票信息的概述(请注意按语关于样本代码的可用性的文章),但见下文。

更具体地讲 ,你可以找到你需要采取以达到这篇文章的另一页上你的目标,看到初始步骤嵌入,并与Macromedia Flash播放器在C#中的Windows应用程序通信 -特别请按照文章/步骤直至并包括部分使Macromedia Flash Player的ActiveX控件可用在Visual Studio .NET中

一旦你完成了概述步骤将添加Shockwave ActiveX control到您的工具箱和一个特定的项目引用您可以简单地双击这个参考(名为ShockwaveFlashObjects在Visual Studio 2008),这将打开Visual Studio的对象浏览器突出assembly Interop.ShockwaveFlashObjects ; 然后导航下入namespace ShockwaveFlashObjects ,在那里你会发现,除其他外,在interface IShockwaveFlash ,露出(取决于您的视图过滤器)的所有成员,包括各自的C#签名所需的外部方法



Answer 2:

如果您可以访问您的SWF(有源的话),那么所有你需要做的就是添加一个回调到返回函数的所有你已经与ExternalInterface的使用设置为一个数组,字符串等方法

如果您没有访问SWF源,你可以再拍瑞士法郎,与ExternalInterface的设定,让你可以调用它。 将原件SWF在您的新的,并在INIT处理程序,启动scavanging对于可能被称为连接使用,以ExternalInterface.addCallback方法的describeType 。

这是我的想法:

var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.INIT, loaded);
    loader.load(new URLRequest('externalInterfaceTest.swf'));
function loaded(e:Event):void{
    //get all the methods in the loaded swf
    var methods:XMLList = describeType(e.target.content).method;
    for each(var method:XML in methods){
        //get methods defined by the author/not belonging to flash.display.*,flash.events.*,etc
        if(method.@declaredBy.indexOf('flash') == -1){
            trace('\nmethod description start========================');
            trace('methodName: ' + method.@name);
            trace('returnType: ' + method.@returnType);
            for each(var param:XML in method.parameter){
                trace('parameter ' + param.@index + ' type: ' + param.@type + ' optional: ' + param.@optional);
            }
            trace('\nmethod description end\n========================');
        }
    }
}

这将工作,如果:

  • 加载不具有的DocumentClass瑞士法郎,可能被添加的回调函数是在时间轴上,因此公众
  • 您加载SWF有ExternalInterface.addCallback联的所有方法声明为public

如果你有到SWF或开发商没有进入,一些道德反编译可能会有帮助。

一种不同的方法是使用由其他开发商来检查主权财富基金发展类。 这里有些例子:

  • senocular的SWFReader
  • 蒂博因贝特的SWFExplorer
  • 丹尼斯Kolyako的getDefinitionNames

这些类可能无法提供你所需要的确切功能,但它是一个很好的起点,你需要什么,只有你会使用二进制数据(我不是很擅长现在)寻找。 你可以找到SWF文件规范在这里 。

希望这可以帮助。



Answer 3:

你必须从C#代码读取SWF文件要做到这一点 - 不以任何真正意义上的与它通信。 这篇文章将指向您在正确的方向,但也有可能会是相当多的工作要做。 (您将需要反编译字节码,看获得通过什么功能ExternalInterface.addCallback 。)

ActionScript的字节码格式文件 ,因为是SWF格式 。



文章来源: C# and Flash communication