Bild aus dll laden

  • 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
    [autoit]

    #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) + 8)
    DllCall("", "UInt", DllStructGetData($dll2, 1), "UInt", $pStream)
    _WinAPI_DeleteObject($pStream)
    $pStream = 0
    _MemGlobalFree($hData)
    EndIf
    EndFunc ;==>_SetImagefromResource

    [/autoit]
    • Offizieller Beitrag

    DFPWare, ich benutze für das Erstellen einer Leerdll immer ein Tools aus dem Französischen Forum.
    Wie der Autor heißt oder aus welchem Beitrag weiß ich nicht mehr.
    Hab dir mal den Sourcecode von RDG angehängt.

    PS: Ich finde den XN Resource Editor besser als Reshacker. Den Link zu XN findest du in meiner Signatur.

  • Raupi Okay ich probiers mit den neuen tools mal aus

    Greenhorn was machen die ganzen Object Files und Assembler Files, hast du das mit c++ oder ähnlichem gemacht?

    Ich hab einfach im Ressource Hacker ne neue Ressource erstellt und da das Bild reingepackt.

    DFPWare

    Edit: Ich blick durch das Programm von den Franzosen nich durch, wofür ist das zweite Fenster und warum funktioniert der Generate Dll Knopf nicht?

  • Greenhorn was machen die ganzen Object Files und Assembler Files, hast du das mit c++ oder ähnlichem gemacht?

    Assembler, wie der Dateiname vermuten lässt ...

    Ich hab einfach im Ressource Hacker ne neue Ressource erstellt und da das Bild reingepackt.

    So kann man es auch machen.

    Edit: Ich blick durch das Programm von den Franzosen nich durch, wofür ist das zweite Fenster und warum funktioniert der Generate Dll Knopf nicht?

    In dem zweiten Fenster kannst Du der DLL Ressourcen hinzufügen.


    Gruß
    Greenhorn