3

C# 有什么方法可以获取 swf 通过 ExternaInterface 公开的方法列表?

4

3 回答 3

3

更新:

刚刚意识到我误读了您的问题,因为您正在寻找通过 FlexExternalInterface class而不是Shockwave ActiveX control本身定义的方法;我将在下面保留我的原始答案,因为它SWF通常对通过 C# 的使用可能仍然有帮助。

关于ExternalInterface我现在没有答案,但您可能会查看Fun with C# 和 Flash Player 8 External API以首先了解如何通过 C# 使用此 API。(另一个有用的示例可能是在 Python 和 C# 应用程序中使用 Flash 8 的外部接口。)

从我在上一篇文章中读到的内容来看,可能没有直接的解决方案,并且通过将精心制作的XML 片段传递给的调用约定CallFunction()有些古怪,但原则上您应该能够将 Georges解决方案翻译成这个(正如我所说,它是可能不会很漂亮;)

祝你好运!


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

SWF对于 Windows 是通过Adob​​e Flash Player ActiveX 控件实现的,因此您可以通过COM 互操作性从 .NET 使用它。

您可以在 Adob​​e 网站上找到关于此的(旧版)文章/示例,请参阅在 C# 应用程序中嵌入 Macromedia Flash Player 以显示股票信息以获取概述(请注意文章中关于示例代码不可用的介绍性说明),但是见下文。

更具体地说,您可以在本文的另一页上找到实现目标所需的初始步骤,请参阅在 C# Windows 应用程序中嵌入和与 Macromedia Flash Player 通信- 特别是请按照文章/步骤直至并包括部分使 Macromedia Flash Player ActiveX 控件在 Visual Studio .NET 中可用

完成将 . 添加Shockwave ActiveX control到工具箱和特定项目引用的概述步骤后,您只需双击此引用(ShockwaveFlashObjects在 Visual Studio 2008 中命名),这将打开Visual Studio 对象浏览器,突出显示assembly Interop.ShockwaveFlashObjects; 然后向下导航到namespace ShockwaveFlashObjects,您将在其中找到 ,interface IShockwaveFlash公开(取决于您的视图过滤器)其所有成员,包括所需的外部方法及其各自的 C# 签名

于 2009-09-08T14:54:42.680 回答
2

如果您可以访问您的 swf(有它的源代码),那么您需要做的就是向一个函数添加一个回调,该函数返回您设置的所有用于 ExternalInterface 作为数组、字符串等的方法。

如果您无权访问 swf 源,您可以制作另一个 swf,使用 ExternalInterface 设置它,以便您可以调用它。将原始 swf 加载到新的 swf 和INIT处理程序中,开始搜索可能被调用的方法,这些方法使用describeType链接到 ExternalInterface.addCallback 。

这就是我的想法:

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========================');
        }
    }
}

如果出现以下情况,这将起作用:

  • 您加载的 swf 没有 DocumentClass,可能作为回调添加的函数在时间轴中,因此是公开的
  • 您加载的 swf 具有与 ExternalInterface.addCallback 链接的所有方法,声明为 public

如果您无权访问 swf 或开发人员,则进行一些符合道德的反编译可能会有所帮助。

另一种方法是使用其他开发人员开发的类来检查 swf。这里有些例子:

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

希望这可以帮助。

于 2009-08-30T14:09:06.053 回答
0

您必须通过从 C# 代码中读取 SWF 文件来执行此操作,而不是通过任何真正意义上的与它进行通信。这篇文章将为您指明正确的方向,但可能还有很多工作要做。(您需要反编译字节码并查看传递给的函数ExternalInterface.addCallback。)

ActionScript 字节码格式已记录在案SWF 格式也是如此。

于 2009-09-11T17:11:52.300 回答