【摘要】exe格式的swf文件不過是一個Flash播放器程序后面跟著一個swf文件,兩個文件合成一個文件.由于它自帶了播放器,所以比較方便,但缺點是文件體積大.本文著重介紹運用VB 6.0實現對*.swf文件到*.exe文件的轉換.
【關鍵詞】VB6.0;轉換;Flash播放器
1.引 言
在實際教學中,我們經常會遇到這樣的問題,我們制作的Flash課件拿到沒有安裝Flash播放器的機器上不能夠播放演示.那么,有沒有一種好的辦法能夠在沒有安裝Flash播放器的機器上順利地播放Flash程序呢?帶著這個問題,我們首先想到了格式轉換,利用VB6.0能夠很好地解決此問題.
2.播放器對swf文件的處理
Flash播放器在一個顯示幀標簽到來之前會處理顯示幀標簽之前swf文件的所有標簽.在這個時候,播放列表被復制到屏幕上面,與此同時Flash播放器在處理下一幀之前是空閑的.第一幀所顯示的內容,是在第一個顯示幀標簽之前的所有控制型標簽操作產生的累積效果.第二幀所顯示的內容,是從文件開始到第二個顯示幀標簽所有控制型標簽操作產生的累積效果.以此類推.
3.由swf文件轉換為exe格式的文件
swf文件轉換為exe格式的文件轉換步驟:
(1)以二進制方式讀入你選定的Flash播放器,并原封不動地寫入新文件.這個播放器以Adobe Flash Player為宜.播放器的版本不要太高,6.0左右即可,因為版本越高,體積越大.
(2)以二進制方式讀入一個swf文件內容,并原封不動地寫入新文件.
(3)寫入四個字節的文件標識符“56 34 12 FA”.
(4)寫入swf文件長度.
4.代碼實現過程
新建一個工程,在窗體上添加3個文本框、1個按鈕.
Text1輸入全路徑源文件名,Text2輸入轉換后的全路徑文件名,Text3輸入全路徑播放器文件名.
按鈕1的標題是“轉為exe”.
如下圖所示:
程序代碼:
Option Explicit
Private Sub Text1_DblClick() ’選擇源文件
On Error GoTo 100
CD.Filter = \"*.exe;*.swf|*.exe;*.swf\"
CD.ShowOpen
If Len(Dir(CD.FileName)) = 0 Then Exit Sub
Text1 = CD.FileName
Text2 = Left(Text1, Len(Text1) - 3) IIf(LCase(Right(Text1, 3)) = \"swf\", \"exe\", \"swf\")
100
End Sub
Private Sub Text3_DblClick() ’選擇播放器
On Error GoTo 100
CD.Filter = \"播放器文件(*.exe)|*.exe\"
CD.ShowOpen
If Len(Dir(CD.FileName)) Then Text3 = CD.FileName
100
End Sub
Private Sub Command1_Click() ’SWF轉EXE
If Len(Text1) = 0 Or LCase(Right(Text1, 3)) <> \"swf\" Then MsgBox \"請選擇要轉換的 SWF 文件\": Exit Sub
If Len(Text3) = 0 Or LCase(Right(Text3, 3)) <> \"exe\" Then MsgBox \"請輸入播放器文件名\": Exit Sub
If Len(Text2) = 0 Then MsgBox \"請輸入要保存的 EXE 文件名\": Exit Sub
If SWFtoEXE(Text1, Text2, Text3) Then
MsgBox \"轉換成功!\"
Else
MsgBox \"轉換失敗!\"
End If
End Sub
Private Sub Command2_Click() ’EXE轉SWF
If Len(Text1) = 0 Or LCase(Right(Text1, 3)) <> \"exe\" Then MsgBox \"請選擇要轉換的 EXE 文件\": Exit Sub
If Len(Text2) = 0 Then MsgBox \"請輸入要保存的 SWF 文件名\": Exit Sub
If EXEtoSWF(Text1, Text2) Then
MsgBox \"轉換成功!\"
Else
MsgBox \"轉換失敗!\"
End If
End Sub
Private Function SWFtoEXE(swfFile As String, exeFile As String, PlayreFile As String) As Boolean
On Error GoTo 100
Dim fLen As Long
Dim Dat() As Byte
Open swfFile For Binary As #1’打開待轉換的SWF文件
Open exeFile For Binary As #2’創建將生成的EXE文件
Open PlayreFile For Binary As #3’創建將生成的EXE文件
fLen = LOF(3)
ReDim Dat(fLen - 1)
Get #3, , Dat
Put #2, , Dat ’將播放器寫入文件2
fLen = LOF(1)
ReDim Dat(fLen - 1)
Get #1, , Dat
Put #2, , Dat ’將SWF文件寫入到文件2
ReDim Dat(3)
Dat(0) = Val(H56): Dat(1) = Val(H34): Dat(2) = Val(H12): Dat(3) = Val(HFA) ’56 34 12 FA是EXE形式的標識符
Put #2, , Dat ’寫入標識符
Put #2, , fLen ’寫入SWF文件長度
SWFtoEXE = True
100
Close
End Function
Private Function EXEtoSWF(exeFile As String, swfFile As String) As Boolean
On Error GoTo 100
Dim Dat() As Byte
Dim fLen As Long
Dim n As Long, i As Long, st As String
Open exeFile For Binary As #1
fLen = LOF(1) ’獲取exe文件長度
ReDim Dat(3)
Get #1, fLen - 7, Dat ’獲取exe格式的Flash文件標識
For i = 0 To 3: st = st Hex(Dat(i)): Next
If st <> \"563412FA\" Then GoTo 100 ’如果不是EXE格式的Flash文件退出
Get #1, fLen - 3, n ’獲取exe文件中的swf部分長度
ReDim Dat(n - 1)
fLen = fLen - n - 7
Get #1, fLen, Dat ’讀取exe文件中的swf部分
Close #1
st = \"\"
For i = 0 To 2: st = st Chr(Dat(i)): Next
If InStr(\"FWS,CWS\", st) = 0 Then Exit Function ’如果不是EXE格式的Flash文件退出
Open swfFile For Binary As #2
Put #2, , Dat
Close #2
EXEtoSWF = True
Exit Function
100
Close
End Function
以上程序代碼為*.swf文件到*.exe文件的轉換.由于篇幅有限,我們對以上的EXEtoSWF 函數的代碼稍加改動,還可以由exe格式的文件中剝離出播放器來.
【參考文獻】
[1]Visual Basic從入門到精通.北京:人民郵電出版社,2010.
[2]剖析SWF文件結構探秘AVM運行原理.by laan,2009(12).
[3]龔沛曾,等.Visual Basic程序設計簡明教程.北京:高等教育出版社,2006.