Code: Alles auswählen
Procedure _CreateStreamFromMem(Addr.l, Size.l)
  Protected.l mem = GlobalAlloc_(#GMEM_MOVEABLE, Size)
  Protected *ptr, Stream.IStream
  If mem
    *ptr = GlobalLock_(mem)
    If *ptr
      CopyMemory(Addr, *ptr, Size)
      CreateStreamOnHGlobal_(mem, #True, @Stream.IStream)
      GlobalUnlock_(mem)
    EndIf
    If Stream = 0
      GlobalFree_(mem)
    EndIf
  EndIf
  ProcedureReturn Stream
EndProcedure
Procedure CatchImageEx(Image, Addr, Size, Flags = 0)
  Protected dxsf.nIDXSurfaceFactory, dxtf.IDXTransformFactory, Stream.IStream, surf.IDXSurface, lock.IDXDCLock, re.rect
  Protected.l Success, DestDC, DC, result = CoInitialize_(0)
  If result = #S_FALSE Or result = #S_OK
    CoCreateInstance_(?CLSID_DXTransformFactory, 0, #CLSCTX_INPROC_SERVER, ?IID_IDXTransformFactory, @dxtf.IDXTransformFactory)
    If dxtf
      dxtf\QueryService(?IID_IDXSurfaceFactory, ?IID_IDXSurfaceFactory, @dxsf.nIDXSurfaceFactory)
      If dxsf
        Stream.IStream = _CreateStreamFromMem(Addr, Size)
        If Stream
          dxsf\LoadImageFromStream(Stream, 0, 0, 0, ?IID_IDXSurface, @surf.IDXSurface)
          If surf
            surf\LockSurfaceDC(0, #INFINITE, #DXLOCKF_READ, @lock.IDXDCLock)
            If lock
              DC = lock\GetDC()
              If DC
                GetClipBox_(DC, re.rect)
                If Image = #PB_Any
                  result = CreateImage(#PB_Any, re\right, re\bottom, Flags)
                  Image = result
                Else
                  result = CreateImage(Image, re\right, re\bottom, Flags)
                EndIf
                If result
                  DestDC = StartDrawing(ImageOutput(Image))
                  If DestDC
                    Success = BitBlt_(DestDC, 0, 0, re\right, re\bottom, DC, 0, 0, #SRCCOPY)
                    StopDrawing()
                  EndIf
                  If Success = #False : FreeImage(Image) : EndIf
                EndIf
              EndIf
              Lock\Release()
            EndIf
            surf\Release()
          EndIf
          dxsf\Release()
        EndIf
        Stream\Release()
      EndIf
      dxtf\Release()
    EndIf
    ;CoUninitialize_() ; dosn't work with this ?!?
  EndIf
  If Success:ProcedureReturn result:EndIf
  ProcedureReturn #False
  DataSection
  EndDataSection
EndProcedure




 @NicTheQuick Auch ein Danke an Dich
 @NicTheQuick Auch ein Danke an Dich

