Re: CatchImageEx (Windows API) Adresslesefehler [Gelöst]
Verfasst: 11.08.2014 19:00
Seit Version 5.3 von PB erhalte ich in der Zeile mit "CopyMemory(Addr, *ptr, Size)" in der Prozedur "_CreateStreamFromMem" einen Adresslesefehler, bei Version 5.22 lief das ganze noch. Hat jemand eine Ahnung weshalb es bei der Version 5.3 zu genanntem Fehler kommt bez. dessen Ursache?
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