Bilder in Dll Datei speichern und dann wieder laden.

  • Wie man der Überschrift unschwer entnehmen kann, möchte ich verschiedene Bilder in einer Dll Datei speichern und dann wie normale Bilder im Code benutzen. (Mit Gdi+)

    1. Weches Programm enpfehlt ihr zum Speichern von Bildern in einer Dll.
    2. Wie lade ich die Bilder wieder aus der dll?

    Ich hab mit der Sufu nicht wirklich was gefunden also bitte ich nach langer Zeit wieder einmal um Hilfe.

    Danke im vorraus.

    mfg Ubuntu

    Einmal editiert, zuletzt von Ubuntu (11. April 2010 um 18:08)

  • Bilder in einer Dll speichern geht sehr gut mit Resourcehacker.

    [autoit]


    #include-once
    #include <GDIPlus.au3>
    ;~ #include <WinAPI.au3>
    _GDIPlus_Startup()
    ; #FUNCTION# ======================================================================================
    ; Name ..........: _GDIPlus_ExtractImage()
    ; Description ...: Description
    ; Syntax ........: _GDIPlus_ExtractImage($sDllPath, $sResName, $sExtractPath)
    ; Parameters ....: $sDllPath - Der Pfad zur Dll die das BMP enthält
    ; $sResName - Der Resourcen Name des BMP´s
    ; $sExtractPath - Der Pfad wohin das BMP extrahiert werden soll
    ; Return values .: Success
    ; Failure
    ; Author ........: Sprenger120
    ; Modified ......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; =================================================================================================

    [/autoit][autoit][/autoit][autoit]

    Func _GDIPlus_ExtractImage($sDllPath, $sResName, $sExtractPath)
    $hDll = _WinAPI_LoadLibrary($sDllPath)
    $hBitmap = _WinAPI_LoadBitmap($hDll, $sResName)
    $hImg = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    _GDIPlus_ImageSaveToFile($hImg, $sExtractPath)
    _WinAPI_FreeLibrary($hDll)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteObject($hImg)
    If Not FileExists($sExtractPath) Then Return SetError(-1, 0, -1)
    Return 1
    EndFunc

    [/autoit]


    für das laden (das Bild wird da gespeichert, das müsstest du ersetzen)

    • Offizieller Beitrag


    1. Weches Programm enpfehlt ihr zum Speichern von Bildern in einer Dll.

    ResHacker, zu finden: ..Programme\AutoIt3\SciTE\AutoIt3Wrapper\ResHacker.exe

    2. Wie lade ich die Bilder wieder aus der dll?

    Kommt drauf an, welches Bildformat du hast. Für Icon geht ganz einfach: GUICtrlCreateIcon(Dll, IconNr/name,....)


    Edit: Man sollte nicht fernsehen beim Schreiben, nun ist schon alles gesagt worden. :D

  • Erstmal Danke

    Zitat

    Der Pfad zur Dll die das BMP enthält

    Geht das auch mit anderen Formaten?

    mfg Ubuntu

  • Ich wär froh wenn noch jemand eine Möglichkeit wüsste, aber fürs erste ist es ja immer noch möglich alles zu konvertieren
    :|

    mfg Ubuntu

    • Offizieller Beitrag

    Ich benutze zum laden eines Bildes aus einer DLL Datei folgendes:

    [autoit]

    ;#Function# ============================================================================================================================================
    ; Name............: _GetImagefromResource
    ; Description.....: Laden eines Bildes (BMP,GIF,JPG) aus einer Resourcedatei
    ; Syntax..........: _GetImagefromResource($Resname, $Resfile = -1, $ResType = 10)
    ; Parameters......:
    ; $Resname - Name der Resource
    ; $Resfile - Resourcedateiname , wenn leer wird die Autoit Exe Datei verwendet
    ; $ResType - Resourcetype 2= Bitmap, alle anderen = 10. GIF und JPG Dateien müssen als RCDATA gespeichet sein.
    ; Return values .:
    ; Success - Handle des des Bitmaps
    ; Failure - Comming soon
    ; Author ........:
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _GetImagefromResource($Resname, $Resfile = -1, $ResType = 10)
    Local Const $IMAGE_BITMAP = 0
    Local $hmod, $hwnd, $InfoBlock, $ResSize, $Mem, $pMem, $dll, $dll2, $hData, $pData, $pStream, $ret, $hBitmap, $pBitmap
    If $Resfile = -1 Then; Resfile = Executable Autoit Exe
    $hmod = _WinAPI_GetModuleHandle("")
    If @error Then Return SetError(1, 0, 0)
    Else
    $hmod = _WinAPI_LoadLibrary($Resfile)
    If @error Then Return SetError(2, 0, 0)
    EndIf
    If $ResType =2 Then
    $hBitmap = _WinAPI_LoadImage($hmod, $Resname, $IMAGE_BITMAP, 0, 0, 0)
    If @error Then Return SetError(3, 0, 0)
    If $Resfile <> -1 Then DllCall("Kernel32.dll", "int", "FreeLibrary", "str", $hmod)
    Return $hBitmap
    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)
    _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)
    If $Resname <> -1 Then _WinAPI_FreeLibrary($hmod)
    Return $hBitmap
    EndIf
    EndFunc ;==>_GetImagefromResource

    [/autoit]
  • Super vielen Dank :thumbup:

    Genau das was ich gesucht habe.
    Ich werd das bei gelegenheit mal ausprobieren.

    mfg Ubuntu

    • Offizieller Beitrag

    Zum erstellen/bearbeiten kannst du den XN Resource Editor benutzen. http://www.wilsonc.demon.co.uk/d10resourceeditor.htm

    Aber nicht vergessen, alle Bilddateien außer BMP als RCDATA abspeichern, sonst kann die Funktion es nicht aus der Dll laden.