最近要做一個(gè)電子書(shū),利用的是FlashPaper將Word文件轉換為SWF格式文件,因為需要在光盤(pán)上自動(dòng)運行,所以在網(wǎng)上尋找Swf 轉 Exe文件的工具,找到JerkFlashV2,試了一下,才發(fā)現該工具轉換成的EXE文件是基于Flash Player 6.0的,有許多Flash Palery的新功能無(wú)法使用,找了一下其它的工具,均為基于6.0版本的,無(wú)奈,只好動(dòng)手自己編寫(xiě)一個(gè)。:)
參照《FLASH工具的秘密》所說(shuō)的方法,用VB6編寫(xiě)了一個(gè),改掉了該方法中處理速度慢的問(wèn)題,并能夠在沒(méi)有COMDLG32.OCX(該控件為VS6中用來(lái)顯示各種對話(huà)框的,如打開(kāi)文件、保存文件、顯示打印機設置等)的計算機上運行。工作摘要如下:
1、準備最新版本的Flash Player,我用的是8.0(文件名為SAFlashPlayer.exe),9.0的我還沒(méi)用到

2、用VB6新建一個(gè)EXE項目,將SAFlashPlayer.exe添加為該工程的資源文件,在此,我使用了其默認屬性:
類(lèi)型:CUSTOM
編號:101
語(yǔ)言:中文(中國)
3、新建一窗體,如下所示:

3、該窗體代碼如下,基本上類(lèi)似于《FLASH工具的秘密——SWF2EXE》一文所說(shuō),但作了一些改動(dòng),并優(yōu)化了一些部分:
Private Sub Command1_Click()
Dim strFile As String
strFile = ShowOpenFileDialog(Me, "動(dòng)畫(huà)文件(*.swf)|*.swf|所有文件(*.*)|*.*", "")
If strFile <> "" Then
Text1.Text = strFile
End If
End Sub
Private Sub Command2_Click()
If Trim(Text1.Text) <> "" Then Text2.Text = Left(Text1.Text, InStr(1, Text1.Text, ".")) & "exe"
Dim strFile As String
strFile = ShowSaveFileDialog(Me, "EXE文件(*.exe)|*.exe", "")
If strFile <> "" Then
Text2.Text = strFile
End If
End Sub
Private Sub Command3_Click()
‘暫時(shí)Disable掉按鈕
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = False
Dim exetog As Long ‘定義EXE形式標識符
Dim filelong As Long
Dim copy() As Byte
copy = LoadResData(101, "CUSTOM") ‘將資源文件存放在copy()中
Open Text1.Text For Binary As #1 ‘打開(kāi)待轉換的SWF文件
Open Text2.Text For Binary As #2 ‘創(chuàng )建將生成的EXE文件
‘將播放器以二進(jìn)制形式寫(xiě)入到中的內容寫(xiě)入文件2中
Put #2, , copy
‘將SWF文件寫(xiě)入到文件2中
filelong = LOF(1)
ReDim copy(filelong - 1) As Byte
Get #1, , copy
Put #2, , copy
‘寫(xiě)入EXE形式文件標識符
filelong = LOF(2)
exetog = 1193046 ‘1193046是EXE形式的標識符(56 34 12 FA)中的前三個(gè)字節56 34 12的十進(jìn)制值
Put #2, , exetog
Seek #2, filelong + 4 ‘調整文件指針到filelong+4字節處
exetog = 250 ‘250是EXE形式的標識符的最后一個(gè)字節FA的十進(jìn)制值
Put #2, , exetog
Seek #2, filelong + 5 ‘調整文件指針到filelong+5字節處
‘寫(xiě)入SWF文件長(cháng)度
filelong = LOF(1)
Put #2, , filelong
Close #1
Close #2
MsgBox "轉換完畢!"
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
End Sub
另外,為了能夠在沒(méi)有COMDLG32.OCX的計算機上運行,該程序沒(méi)有使用CommonDialog控件,而采用API方式,為此建立了一個(gè)模塊General,內容如下:Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_ENABLEHOOK = &H20
Public Const OFN_ENABLETEMPLATE = &H40
Public Const OFN_ENABLETEMPLATEHANDLE = &H80
Public Const OFN_EXPLORER = &H80000
Public Const OFN_EXTENSIONDIFFERENT = &H400
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_LONGNAMES = &H200000
Public Const OFN_NOCHANGEDIR = &H8
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFN_NOLONGNAMES = &H40000
Public Const OFN_NONETWORKBUTTON = &H20000
Public Const OFN_NOREADONLYRETURN = &H8000
Public Const OFN_NOTESTFILECREATE = &H10000
Public Const OFN_NOVALIDATE = &H100
Public Const OFN_OVERWRITEPROMPT = &H2
Public Const OFN_PATHMUSTEXIST = &H800
Public Const OFN_READONLY = &H1
Public Const OFN_SHAREAWARE = &H4000
Public Const OFN_SHAREFALLTHROUGH = 2
Public Const OFN_SHAREWARN = 0
Public Const OFN_SHARENOWARN = 1
Public Const OFN_SHOWHELP = &H10
Public Const OFS_MAXPATHNAME = 256
Public Const LF_FACESIZE = 32
‘OFS_FILE_OPEN_FLAGS and OFS_FILE_SAVE_FLAGS below
‘a(chǎn)re mine to save long statements; they‘re not
‘a(chǎn) standard Win32 type.
Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_CREATEPROMPT Or OFN_NODEREFERENCELINKS Or OFN_HIDEREADONLY Or OFN_ALLOWMULTISELECT
Public Const OFS_FILE_SAVE_FLAGS = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_OVERWRITEPROMPT Or OFN_HIDEREADONLY
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Public Function ShowOpenFileDialog(Form As Form, Filter As String, Optional OldFileName As String = "") As String
Dim ofn As OPENFILENAME
Dim rtn As Long
ofn.hwndOwner = Form.hWnd
ofn.hInstance = App.hInstance
ofn.lpstrFilter = Replace(Filter, "|", Chr(0))
ofn.lpstrFile = Space(2047)
ofn.nMaxFile = Len(ofn.lpstrFile) + 1
ofn.lpstrFileTitle = Space(510)
ofn.nMaxFileTitle = Len(ofn.lpstrFileTitle) + 1
ofn.lpstrInitialDir = App.Path
ofn.lpstrTitle = "打開(kāi)文件"
ofn.flags = OFS_FILE_OPEN_FLAGS
ofn.lStructSize = Len(ofn)
rtn = GetOpenFileName(ofn)
If rtn >= 1 Then
Dim il As Integer
il = InStr(1, ofn.lpstrFile, Chr(0))
If il <= 0 Then il = Len(ofn.lpstrFile)
ShowOpenFileDialog = Left(ofn.lpstrFile, il)
Else
ShowOpenFileDialog = OldFileName
End If
End Function
Public Function ShowSaveFileDialog(Form As Form, Filter As String, Optional OldFileName As String = "") As String
Dim ofn As OPENFILENAME
Dim rtn As Long
ofn.hwndOwner = Form.hWnd
ofn.hInstance = App.hInstance
ofn.lpstrFilter = Replace(Filter, "|", Chr(0))
ofn.lpstrFile = Space(2047)
ofn.nMaxFile = Len(ofn.lpstrFile) + 1
ofn.lpstrFileTitle = Space(510)
ofn.nMaxFileTitle = Len(ofn.lpstrFileTitle) + 1
ofn.lpstrInitialDir = App.Path
ofn.lpstrTitle = "打開(kāi)文件"
ofn.lpstrDefExt = ""
ofn.flags = OFS_FILE_SAVE_FLAGS
ofn.lStructSize = Len(ofn)
rtn = GetSaveFileName(ofn)
If rtn >= 1 Then
Dim il As Integer
il = InStr(1, ofn.lpstrFile, Chr(0))
If il <= 0 Then il = Len(ofn.lpstrFile)
ShowSaveFileDialog = Left(ofn.lpstrFile, il)
Else
ShowSaveFileDialog = OldFileName
End If
End Function


