2009-08-30 41 views
1

我想知道如何使用PHP基本编辑.swf文件,以更改单个变量或更改。我会如何去做这件事?有没有办法在不知道机器码的情况下编辑它?使用PHP写入.swf文件

如果有一个如何做到这一点的例子,我可以在哪里找到它?

谢谢!

或者,如果有更简单的方法去做这件事,请让我知道!

回答

1

问题是旧的,但由于它恰好与我一直在努力的一致,所以我想我会把东西放在一起,以防其他人发现它有用。该解决方案仅适用于AS3。它可以让你改变实例变量和常量的值。

假设你有下面的类:

package pl.krakow.rynek { 
    import flash.display.Sprite; 

    public class Advertisement extends Sprite { 

     private var title:String = 'Euro 2012 LIVE!'; 

     /* ... */ 
    } 
} 

你想要的VAR 标题别的东西。这样做的代码如下:

<?php 

require_once 'flaczki/classes.php'; 

// parse the SWF file, decoding only those tags needed by the injector 
$input = fopen("input.swf", "rb"); 
$parser = new SWFParser; 
$injector = new AS3ConstantInjector; 
$swfFile = $parser->parse($input, $injector->getRequiredTags()); 

$classConstants = array(
    'pl.krakow.rynek.Advertisement' => array(
     'title' => 'Free Beer!' 
    ) 
); 

// inject the values and reassemble the file 
$injector->inject($swfFile, $classConstants); 
$output = fopen($outPath, "wb"); 
$assembler = new SWFAssembler; 
$assembler->assemble("output.swf", $swfFile); 

?> 

该代码应该是不言自明的。首先分析SWF文件,进行修改,并将内存结构保存到文件中。 AS3ConstantInjector.inject()期望作为第二个参数的数组,该数组由你想要修改的类的限定名键控。数组本身为每个类保存新值,其中键为变量/常量名。

要查看的SWF文件中的变量,使用AS3ConstantExtractor:

<?php 

require_once 'flaczki/classes.php'; 

$input = fopen("button.swf", "rb"); 
$parser = new SWFParser; 
$extractor = new AS3ConstantExtractor; 
$swfFile = $parser->parse($input, $extractor->getRequiredTags()); 
$classConstants = $extractor->extract($swfFile); 

print_r($classConstants); 

?> 

的Flaczki类可以在http://code.google.com/p/flaczki/downloads/list

下载,您可以找到更多关于Flaczki框架在项目开发的博客http://flaczkojad.blogspot.com/

+0

非常好,谢谢! – Cyclone 2012-08-12 15:39:14

2

使用Actionscript,加载外部数据非常简单:XMLJSON是实现它的两种标准方式,并且都可以通过PHP轻松生成。你究竟想要做什么?

+0

我想让下载一个闪存文件的副本成为可能,但要让下载它的用户定制该闪存文件。 (即,他们制作了一个Flash徽标,他们现在可以下载.swf) – Cyclone 2009-08-30 16:26:42

+0

您是否需要添加自定义图片? – 2009-08-30 16:36:53

+0

@cyclone:owkay我明白了...这样,生成idd是唯一的选择...... marby在问题中包含了这个。 – 2009-08-31 12:17:22

0

而不是想着如何生成SWF文件,却反其道而行之,让内部行为取决于PHP脚本中的外部逻辑。这样你就不需要(重新)编译你的swf。