怎么实现flash影片格式转换啊?swf -> exe 或 exe -> swf 。
能给个可用的源码参考一下吗。发到我邮箱中也可以,
[email protected]
谢谢。

解决方案 »

  1.   

    原理就是改文件头。引:
     
    以下提供 Swf2Exe 函数部分,最后的 Exe 存放在数组中,Flash 播放器存放在资源文件中。代码用了 lread 和 lwrite,自己认为速度是很快的了,Swf2Exe 函数以及相关自定义函数代码如下: '模块代码 
    Option Explicit Public Const OF_READ = &H0 
    Public Const FILE_BEGIN = 0 
    Public Const FILE_CURRENT = 1 
    Public Const FILE_END = 2 Declare Function lread Lib "kernel32" Alias "_lread" (ByVal hFile As Long, lpBuffer As Any, ByVal wBytes As Long) As Long 
    Declare Function lwrite Lib "kernel32" Alias "_lwrite" (ByVal hFile As Long, ByVal lpBuffer As Any, ByVal wBytes As Long) As Long 
    Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long 
    Declare Function llseek Lib "kernel32" Alias "_llseek" (ByVal hFile As Long, ByVal lOffset As Long, ByVal iOrigin As Long) As Long 
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public SwfFileInByte() As Byte '存放截取出来的 SWF 文件 
    Public ExeFileInByte() As Byte '存放转换后的 EXE 文件 '判断指定的文件是否为 Flash 动画文件。 
    Public Function IsValidFile(ByVal Filename As String) As Boolean If UCase(Right(Filename, 4)) = ".SWF" Then 
    Dim tmp As String * 3 Open Filename For Binary As #1 
    Get #1, 1, tmp 
    Close #1 
    If tmp = "FWS" Then IsValidFile = True 
    ElseIf UCase(Right(Filename, 4)) = ".EXE" Then 
    Dim hFile As Long 
    ReDim SwfFileInByte(3) hFile = lopen(Filename, OF_READ) 
    Call llseek(hFile, -8, FILE_END) 
    Call lread(hFile, SwfFileInByte(0), 4) 
    Call CloseHandle(hFile) 
    If Dword2Hex(SwfFileInByte) = "FA123456" Then 
    IsValidFile = True 
    End If 
    End If End Function 'EXE 格式的动画文件最后8个字节是标志位,其中前4个字节经过高低位的转换之 
    '后如果等于 16 进制的 "FA123456" 就说明这个文件是官方的 EXE 文件;后4个 
    '字节是 EXE 文件中包含的 SWF 文件的大小。 'SWF2EXE 转换函数,转换后的 EXE 文件存放在数组 ExeFileInByte 中。 
    Public Function PutExeToFile(ByVal Filename As String) As Boolean Dim SwfLen As Long, ExeLen As Long, SwfLenByte(3) As Byte 
    Dim hFile As Long On Error GoTo errHandle If Not IsValidFile(Filename) Then 
    Exit Function 
    End If '读出 Flash 播放器 
    ExeFileInByte = LoadResData(100, "CUSTOM") 
    ExeLen = UBound(ExeFileInByte) 
    '取得 Swf 文件的长度 
    ReDim SwfFileInByte(3) 
    hFile = lopen(Filename, OF_READ) 
    Call llseek(hFile, 4, FILE_BEGIN) 
    Call lread(hFile, SwfLenByte(0), 4) 
    SwfLen = CLng("&H" & Dword2Hex(SwfLenByte)) 
    '读出 Swf 文件 
    ReDim SwfFileInByte(SwfLen) 
    Call llseek(hFile, 0, FILE_BEGIN) 
    Call lread(hFile, SwfFileInByte(0), SwfLen) 
    Call CloseHandle(hFile) 
    '合并两个文件内容,并留出8个字节用来存放标志位和大小 
    ReDim Preserve ExeFileInByte(ExeLen + SwfLen + 8) 
    Call CopyMemory(ExeFileInByte(ExeLen + 1), SwfFileInByte(0), SwfLen) 
    '添加标志位 
    ExeFileInByte(ExeLen + SwfLen + 1) = 86 '56 
    ExeFileInByte(ExeLen + SwfLen + 2) = 52 '34 
    ExeFileInByte(ExeLen + SwfLen + 3) = 18 '12 
    ExeFileInByte(ExeLen + SwfLen + 4) = 250 'FA 
    '添加 Swf 文件大小 
    ExeFileInByte(ExeLen + SwfLen + 5) = SwfLenByte(0) 
    ExeFileInByte(ExeLen + SwfLen + 6) = SwfLenByte(1) 
    ExeFileInByte(ExeLen + SwfLen + 7) = SwfLenByte(2) 
    ExeFileInByte(ExeLen + SwfLen + 8) = SwfLenByte(3) PutExeToFile = True 
    Exit Function errHandle: Call CloseHandle(hFile) End Function '将 DWord 值转换为十六进制数。 
    Public Function Dword2Hex(Dword() As Byte) As String Dim iCount As Long 
    Dim tmp As String For iCount = UBound(Dword) To LBound(Dword) Step -1 
    If Dword(iCount) <= 16 Then 
    tmp = tmp & "0" & Hex(Dword(iCount)) 
    Else 
    tmp = tmp & Hex(Dword(iCount)) 
    End If 
    Next Dword2Hex = tmp End Function 用法: If PutExeToFile(SwfFile) Then 
    Open SwfFile For Binary As #1 
    Put #1, , ExeFileInByte 
    Close #1 
    End If 
      

  2.   

    swf2exe成功!谢谢。
    我在引用这段代码时,发现这几个问题,也说出来。1:不能生成有效exe文件。
    我开始将6 版本的flash player 作为资源文件,结果发现部分swf影片不能生成有效的exe文件,就是生成了不能播放。我试想,可能是flash软件在做好动画后,发布影片时设置了参数。于是,我做了一个简短的影片,分别选择以下几项发布。
      ·防止导入(密码)
      ·允许调试(密码)
      ·压缩影片
    结果发现,都能生成可播放(就是有效)的exe文件,说明:不能生成有效exe文件,不是这个原因。
    于是,我看了一下那些文件的生成时间,均在flash mx 2004软件发布之后,就是说应该用7.0的播放器作为资源,最后成功!2:上面isValidFile函数用于判断源文件是否为有效flash文件,我也发现一个小问题在这句:
    If tmp = "FWS" Then IsValidFile = True 
    将读取出来的FWS作为是否有有效swf文件的标志,但我发现,如果在发布影片时只要选择了“压缩影片”这一项,tmp读取出来的是CWS。于是,我改了一下条件,If tmp = "FWS"  or tmp = "CWS" ,OK。上面道我说的对不对,快下班了,我晚上再试一试。如果有错误大家指出一下呵。感谢 DooDu(杜霖:I want,I can.(MmMVP马甲)(准备闭关……)) ,呵呵!^)^