C# 有什么方法可以获取 swf 通过 ExternaInterface 公开的方法列表?
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 是通过Adobe Flash Player ActiveX 控件实现的,因此您可以通过COM 互操作性从 .NET 使用它。
您可以在 Adobe 网站上找到关于此的(旧版)文章/示例,请参阅在 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# 签名。
如果您可以访问您的 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 文件规范。
希望这可以帮助。