Basic Univers
; Convertir un SWF en EXE

;
; Embedded flash player example (ActiveX)
;
; By AlphaSND
;
; Translated to PB4 by Flype
; Playing from included data by Esteban1
;
; Flash ActiveX interface definition
;

Interface IShockwaveFlash Extends IDispatch
  get_ReadyState(a)
  get_TotalFrames(a)
  get_Playing(a)
  put_Playing(a)
  get_Quality(a)
  put_Quality(a)
  get_ScaleMode(a)
  put_ScaleMode(a)
  get_AlignMode(a)
  put_AlignMode(a)
  get_BackgroundColor(a)
  put_BackgroundColor(a)
  get_Loop(a)
  put_Loop(a)
  get_Movie(a)
  put_Movie(a)
  get_FrameNum(a)
  put_FrameNum(a)
  SetZoomRect(a, b, c, d)
  Zoom(a)
  Pan(a, b, c)
  Play()
  Stop()
  Back()
  Forward()
  Rewind()
  StopPlay()
  GotoFrame(a)
  CurrentFrame(a)
  IsPlaying(a)
  PercentLoaded(a)
  FrameLoaded(a, b)
  FlashVersion(a)
  get_WMode(a)
  put_WMode(a)
  get_SAlign(a)
  put_SAlign(a)
  get_Menu(a)
  put_Menu(a)
  get_Base(a)
  put_Base(a)
  get_scale(a)
  put_scale(a)
  get_DeviceFont(a)
  put_DeviceFont(a)
  get_EmbedMovie(a)
  put_EmbedMovie(a)
  get_BGColor(a)
  put_BGColor(a)
  get_Quality2(a)
  put_Quality2(a)
  LoadMovie(a, b.p - bstr)
  TGotoFrame(a, b)
  TGotoLabel(a, b)
  TCurrentFrame(a, b)
  TCurrentLabel(a, b)
  TPlay(a)
  TStopPlay(a)
  SetVariable(a, b.p - bstr)
  GetVariable(a, b.p - bstr)
  TSetProperty(a, b, c)
  TGetProperty(a, b, c)
  TCallFrame(a, b)
  TCallLabel(a, b)
  TSetPropertyNum(a, b, c)
  TGetPropertyNum(a, b, c)
  get_SWRemote(a)
  put_SWRemote(a)
  get_Stacking(a)
  put_Stacking(a)
EndInterface

Prototype AtlAxWinInit()
Prototype AtlAxCreateControl(a.p - bstr, b.l, c.l, d.l)
Prototype AtlAxGetControl(a.l, b.l)

Procedure.l FlashLoadFromData(SwfStart.l, SwfEnd.l, *FlashObject.IShockwaveFlash)
  FlashBuffer = AllocateMemory(SwfEnd - SwfStart + 8) ; let's make room
  If FlashBuffer
    PokeL(FlashBuffer, $55665566) ; now write the header
    PokeL(FlashBuffer + 4, SwfEnd - SwfStart) ; and the file size
    CopyMemory(SwfStart, FlashBuffer + 8, SwfEnd - SwfStart) ; then copy the whole file.
    If CreateStreamOnHGlobal_(FlashBuffer, #True, @FlashStream.IStream)= 0 ; Create a stream.
      *FlashObject\QueryInterface(?IID_IPersistStreamInit, @FlashPSI.IPersistStreamInit) ; Ask for IPersistStreamInit interface
      If FlashPSI
        If FlashPSI\load(FlashStream)= 0 ; load the stream we created
          ReturnValue = 1
        EndIf
        FlashPSI\Release() ; self explained
      EndIf
      FlashStream\Release() ; idem
    EndIf
    FreeMemory(FlashBuffer) ; idem
  EndIf
  ProcedureReturn ReturnValue
EndProcedure

If OpenLibrary(0, "atl.dll")
  AtlAxWinInit.AtlAxWinInit             = GetFunction(0, "AtlAxWinInit")
  AtlAxCreateControl.AtlAxCreateControl = GetFunction(0, "AtlAxCreateControl")
  AtlAxGetControl.AtlAxGetControl       = GetFunction(0, "AtlAxGetControl")
Else
  MessageRequester("Erreur", "Impossible d'executer une fonction necessaire a ce programme !")
  End
EndIf

Movie$ = "Prince of persia.swf"

CoInitialize_(0)

If OpenWindow(0, 100, 100, 450, 350, "Lecteur Flash : " + Movie$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget  | #PB_Window_ScreenCentered | #PB_Window_WindowCentered) And CreateGadgetList(WindowID(0))
  ContainerGadget(0, 0, 0, 0, 0, #PB_Container_BorderLess) ; This will be our container window, where the ActiveX will be rendered
  ; ContainerGadget(0, 8, 8, 284, 299,#PB_Container_Double) ; This will be our container window, where the ActiveX will be rendered
  CloseGadgetList()
 
  ; ButtonGadget(1, 10, 285, 70, 25, "Rejouer", #PB_Button_Toggle)
  ; ButtonGadget(2, 90, 285, 70, 25, "Play")
 
  If AtlAxWinInit()
   
    AtlAxCreateControl("ShockwaveFlash.ShockwaveFlash", GadgetID(0), 0, @Container.IUnknown) ; It always create the IE control even if flash isn't found
   
    If Container
     
      AtlAxGetControl(GadgetID(0), @oFlash.IShockwaveFlash)
     
      If oFlash
       
        If oFlash\QueryInterface(?IID_ShockwaveFlash, @oFlash) = 0 ; Be sure it's a flash object in the IE container
         
          ; oFlash\LoadMovie(0, Movie$)
          FlashLoadFromData(?FlashFileStart, ?FlashFileEnd, oFlash) ; Let's get it from included data
          oFlash\get_ReadyState(@state)   ; 0 = Loading, 1 = Uninitialized, 2 = Loaded, 3 = Interactive, 4 = Complete.
         
          Select state
            Case 4 , 3
              ; oFlash\Play()
              oFlash\FlashVersion(@Version)
              ; Debug "Flash Version: " + Hex(Version)
              ; oFlash\put_BackgroundColor($000000)
              oFlash\get_BackgroundColor(@BackColor)
              ; Debug "BackColor: " + Hex(BackColor)
            Default
              ; Debug state
              ; MessageRequester("Error", "The movie can't be loaded ("+Movie$+")")
              MessageRequester("Erreur", "Impossible de charger la video !")
          EndSelect
          oFlash\put_Quality(0)
          Repeat
            Select WaitWindowEvent(50)
              Case #PB_Event_CloseWindow
                Break
              Case #PB_Event_SizeWindow
                ; ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0)-35)
                ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
                ; ResizeGadget(1, #PB_Ignore, WindowHeight(0)-30, #PB_Ignore, #PB_Ignore)
                ; ResizeGadget(2, #PB_Ignore, WindowHeight(0)-30, #PB_Ignore, #PB_Ignore)
              Case #PB_Event_Gadget
                ; Select EventGadget()
                 ; Case 1
                  ;  Select GetGadgetState(1)
                   ;   Case 0 : oFlash\Stop()
                    ;  Case 1 : oFlash\Play()
                    ; EndSelect
                ; EndSelect
            EndSelect
            oFlash\CurrentFrame(@frame)
            ; SetWindowTitle(0, "Lecteur flash " + Str(frame))
          ForEver
         
          oFlash\Release()
         
        EndIf
       
        oFlash\Release()
       
      EndIf
     
    EndIf
   
  EndIf
 
  CloseWindow(0)   ; Don't forget this one, else the program will crash
 
EndIf

CoUninitialize_()

End

DataSection
IID_ShockwaveFlash: Data.q $11CFAE6DD27CDB6C, $000054534544B896
IID_IPersistStreamInit:
Data.l $7FD52380
Data.w $4E07, $101B
Data.b $AE, $2D, $08, $00, $2B, $2E, $C7, $13
FlashFileStart:
IncludeBinary "Prince of persia.swf"
FlashFileEnd:
EndDataSection