Hallo Leute
ich hatte zwar schonmal gefragt, aber ich habe schon wieder eine Frage dazu.
Also ich hab von Raupi hier eine Funktion zum Laden von Bildern gefunden und wollte diese mal ausprobieren, aber bei mir klappt es einfach nicht.
Es kommt immer bei Zeile 34 ein Error, also durch SetError.
Hier das Skript, die dll ist im Anhang, ich denke an der wirds wohl liegen, die hab ich mit Resource Hacker gemacht:
Spoiler anzeigen
#include <WinAPI.au3>
#include <Memory.au3>
#include <GDIPlus.au3>
#include <Constants.au3>
Global Const $RT_BITMAP = 2
Global Const $RT_RCDATA = 10
Global $gui = GUICreate("Test",300,432)
Global $bg = GUICtrlCreatePic("",10,10,300,432)
_SetImagefromResource($bg, "BG", @ScriptDir & "\pic.dll", 2)
GUISetState()
Do
$msg = GUIGetMsg()
Until $msg = -3
Func _SetImagefromResource($CtrlID, $Resname, $Resfile = -1, $ResType = 10)
;Diese Funktion basiert auf der UDF von [email='Zedna@Autitscript.com'][/email] und Code von [email='Progandy@AutoIt.de'][/email]
Local Const $IMAGE_BITMAP = 0
Local Const $STM_SETIMAGE = 0x0172
Local $hmod, $hwnd, $InfoBlock, $ResSize, $Mem, $pMem, $dll, $dll2, $hData, $pData, $pStream, $ret, $hBitmap, $pBitmap
If $Resfile = -1 Then
$hmod = _WinAPI_GetModuleHandle("")
Else
$hmod = _WinAPI_LoadLibrary($Resfile)
EndIf
If $ResType = $RT_BITMAP Then
$hBitmap = _WinAPI_LoadImage($hmod, $Resname, $IMAGE_BITMAP, 0, 0, 0)
ConsoleWrite("1"&@CRLF)
If @error Then Return SetError(1, 0, 0)
$hwnd = GUICtrlGetHandle($CtrlID)
If $hwnd = 0 Then Return SetError(2, 0, 0)
DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
ConsoleWrite("2"&@CRLF)
If @error Then Return SetError(3, 0, 0)
Else
$InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hmod, "str", $Resname, "long", $ResType)
If @error Then Return SetError(4, 0, 0)
$InfoBlock = $InfoBlock[0]
If $InfoBlock = 0 Then Return SetError(5, 0, 0)
$ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hmod, "int", $InfoBlock)
If @error Then Return SetError(6, 0, 0)
$ResSize = $ResSize[0]
If $ResSize = 0 Then Return SetError(7, 0, 0)
$Mem = DllCall("kernel32.dll", "int", "LoadResource", "int", $hmod, "int", $InfoBlock)
If @error Then Return SetError(8, 0, 0)
$Mem = $Mem[0]
If $Mem = 0 Then Return SetError(9, 0, 0)
$pMem = DllCall("kernel32.dll", "int", "LockResource", "int", $Mem)
If @error Then Return SetError(8, 0, 0)
$pMem = $pMem[0]
If $pMem = 0 Then Return SetError(10, 0, 0)
If $Resfile <> -1 Then DllCall("Kernel32.dll", "int", "FreeLibrary", "str", $hmod)
$hData = _MemGlobalAlloc($ResSize, 2)
$pData = _MemGlobalLock($hData)
_MemMoveMemory($pMem, $pData, $ResSize)
_MemGlobalUnlock($hData)
$ret = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData, "long", 1, "Int*", 0)
$pStream = $ret[3]
_GDIPlus_Startup()
$pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
$pBitmap = $pBitmap[2]
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
$hwnd = GUICtrlGetHandle($CtrlID)
If $hwnd = 0 Then Return SetError(11, 0, 0)
DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
If @error Then Return SetError(12, 0, 0)
_GDIPlus_BitmapDispose($pBitmap)
_GDIPlus_Shutdown()
$dll = DllStructCreate("Uint", $pStream)
$dll2 = DllStructCreate("uInt", DllStructGetData($dll, 1) +
DllCall("", "UInt", DllStructGetData($dll2, 1), "UInt", $pStream)
_WinAPI_DeleteObject($pStream)
$pStream = 0
_MemGlobalFree($hData)
EndIf
EndFunc ;==>_SetImagefromResource