EXE转SWF工具DIY
IT商界
随着Flash在网络上的广泛流行,越来越多的电脑爱好者也开始加入了闪客的行列。然而,网络上许多Flash作品都是EXE形式提供的,这样虽然方便了没有安装Flash插件的朋友,但是EXE形式的Flash不能用于网页制作,更不用说分析Action什么的了。由于手边没有免费的EXE2SWF工具,于是决定自己DIY一个。
转换原理
格式:EXE形式的Flash文件由两部分组成,分别为Flash播放器和后面的Swf文件,播放器文件的标志符是376831、286719、811008(分别对应着Flash 4/5/6版本)。在SWF部分的标志符是ASCII码“FWS”。
原理:我们只要在EXE形式的Flash文件中查找到“FWS”,然后从FWS开始的部分到文件尾全部写到一个新的SWF文件中即可完成转换。
编写程序
下面我们就以C++ Builder 5.0为例来说明实现方法。首先我们设计窗体。打开C++ Builder,在窗体上添加两个Button、两个Edit、一个OpenDialog以及若干个Label工具,界面设计如图所示,其他的采用默认值。
1.Button1按钮是用来打开硬盘上EXE形式的Flash文件的,双击之,添加如下的代码:
void_fastcall TForm1::Button1Click(TObject *Sender)
{ OpenDialog1->Title = "打开要转换的Flash文件";
if (OpenDialog1->Execute())
{Edit1->Text=OpenDialog1->File Name;
Edit2->Text=ChangeFileExt(Edit1->Text,".swf");//此处为了方便自动给出目标文件名}}
2.Button2按钮是用来转换文件格式的,双击之,添加如下代码:
void_fastcall TForm1::Button2Click(TObject *Sender)
{int iFileHandle;
unsigned long iFileLength;
unsigned long iBytesRead;
AnsiString dFileName;
unsigned char *pszBuffer;
iFileHandle = FileOpen(OpenDia log1->FileName, fmOpenRead);//打开源文件
iFileLength = FileSeek(iFileHandle,0,2);//确定源文件的长度
FileSeek(iFileHandle,0,0);
pszBuffer = new char[iFileLength+1]; //读入源文件
if (pszBuffer==NULL)
{return;}
iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
FileClose(iFileHandle);//关闭源文件
if (FileExists(Edit2->Text)) //确定目标文件是否存在,如存在则返回重新命名
{return;}
int i=0;
int ii=0;
for (i=0;i<iFileLength-2;i++) //查找匹配识别字符 FWS
{if ((pszBuffer[i-2]==0)&&(pszBuffer[i-1]==0)&&(pszBuffer[i]=='F')&&(pszBuffer[i+1]=='W')&&(pszBuffer[i+2]=='S'))
{ii=i;}}
i=ii;
pszBuffer=pszBuffer+i;
iFileHandle = FileCreate(Edit2->Text);
if (i!=376831&&i!=286719&&i!=811008);//判断是否为Flash 4/5/6版本
{if(!Application->MessageBoxA("不是官方的Flash文件!强制播放?","警告",IDOK))
return;}
FileWrite(iFileHandle, pszBuffer,iFile Length-i );
FileClose(iFileHandle);
ProgressBar1->Position=i;
delete [] pszBuffer;}
好了,我们现在按一下F9运行,打开一个EXE形式的Flash文件,按下“打开EXE文件”按钮,是不是瞬间就生成了SWF形式的Flash。该程序能够正确识别Flash4/5/6生成的EXE形式的Flash文件。
以上程序在C++ Builder5.5、Windows98下调试通过。
