_ResourceLoadString? < MORE HELP>

  • So, ich hab auch schon im Englischen-Forum geschaut, aber ich fand nichts lesbares. Womit ich wirklich was anfange könnte.
    Ich suche eine Funktione mit der man einen String aus einer .dat-Datei auslesen kann. Ich kenne schon eine Funktion mit der man Bitmaps laden kann, die aber zu zweckenfremden, schaffte ich nicht. Im Spoiler ist diese drin.

    Spoiler anzeigen
    [autoit]

    Func _ResourceLoadImage($DLL, $ResName); THX to Progandy, Zedna
    Local $hInstance, $InfoBlock, $GlobalMemoryBlock, $MemoryPointer, $ResSize, $hData, $pData, $pStream, $dll2, $pBitmap
    $hInstance = DllCall("kernel32.dll", "int", "LoadLibrary", "str", $DLL)
    $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hInstance[0], "str", $ResName, "long", 10)
    $ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hInstance[0], "int", $InfoBlock[0])
    $GlobalMemoryBlock = DllCall("kernel32.dll", "int", "LoadResource", "int", $hInstance[0], "int", $InfoBlock[0])
    $MemoryPointer = DllCall("kernel32.dll", "int", "LockResource", "int", $GlobalMemoryBlock[0])
    DllCall("Kernel32.dll", "int", "FreeLibrary", "str", $hInstance[0])
    $hData = _MemGlobalAlloc($ResSize[0], 2)
    $pData = _MemGlobalLock($hData)
    _MemMoveMemory($MemoryPointer[0], $pData, $ResSize[0])
    _MemGlobalUnlock($hData)
    $pStream = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData, "long", 1, "Int*", 0)
    $pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream[3], "int*", 0)
    $DLL = DllStructCreate("Uint", $pStream[3])
    $dll2 = DllStructCreate("uInt", DllStructGetData($DLL, 1) + 8)
    DllCall("", "UInt", DllStructGetData($dll2, 1), "UInt", $pStream[3])
    _WinAPI_DeleteObject($pStream[3])
    $pStream[3] = 0
    _MemGlobalFree($hData)
    Return $pBitmap[2]
    EndFunc ;==>_ResourceLoadImage

    [/autoit]

    2 Mal editiert, zuletzt von Faweyr (9. Dezember 2009 um 18:48)

  • Ok, hab ich. nun ist das problem wie benutze ich sie.
    mein Versuch:

    [autoit]

    #include "resources.au3"
    $string = _ResourceGet( @ScriptDir & "\GFX.dat", "RCData", "TEST")
    MsgBox(4096, "Test", $string, 10)

    [/autoit]


    geht aber nicht, was hab ich falsch gemacht.
    Die gfx.dat und die au3 im Anhang.

  • Probier mal das:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <WinAPI.au3>

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

    Global Const $RT_CURSOR = 1
    Global Const $RT_BITMAP = 2
    Global Const $RT_ICON = 3
    Global Const $RT_MENU = 4
    Global Const $RT_DIALOG = 5
    Global Const $RT_STRING = 6
    Global Const $RT_FONTDIR = 7
    Global Const $RT_FONT = 8
    Global Const $RT_ACCELERATOR = 9
    Global Const $RT_RCDATA = 10
    Global Const $RT_MESSAGETABLE = 11
    Global Const $RT_GROUP_CURSOR = 12
    Global Const $RT_GROUP_ICON = 14
    Global Const $RT_VERSION = 16
    Global Const $RT_DLGINCLUDE = 17
    Global Const $RT_PLUGPLAY = 19
    Global Const $RT_VXD = 20
    Global Const $RT_ANICURSOR = 21
    Global Const $RT_ANIICON = 22
    Global Const $RT_HTML = 23
    Global Const $RT_MANIFEST = 24
    Global Const $SND_RESOURCE = 0x00040004
    Global Const $SND_SYNC = 0x0
    Global Const $SND_ASYNC = 0x1
    Global Const $SND_MEMORY = 0x4
    Global Const $SND_LOOP = 0x8
    Global Const $SND_NOSTOP = 0x10
    Global Const $SND_NOWAIT = 0x2000
    Global Const $SND_PURGE = 0x40

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

    $string = _ResourceREAD("", $RT_RCDATA, "TEST",0,1) ; leerer String bei eigener Datei
    MsgBox(4096, "Test", $string, 10)

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

    Func _ResourceGet($ResName, $ResType = 10, $ResLang = 0, $DLL = -1)
    Local $hInstance, $InfoBlock, $GlobalMemoryBlock, $MemoryPointer, $ResSize

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

    If $DLL = -1 Then
    $hInstance = _WinAPI_GetModuleHandle("")
    Else
    $hInstance = _WinAPI_LoadLibrary($DLL)
    EndIf
    If $hInstance = 0 Then Return SetError(1, 0, 0)

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

    If $ResLang <> 0 Then
    $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceExA", "int", $hInstance, "long", $ResType, "str", $ResName, "short", $ResLang)
    Else
    $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hInstance, "str", $ResName, "long", $ResType)
    EndIf

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

    If @error Then Return SetError(3, 0, 0)
    $InfoBlock = $InfoBlock[0]
    If $InfoBlock = 0 Then Return SetError(4, 0, 0)

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

    $ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hInstance, "int", $InfoBlock)
    If @error Then Return SetError(5, 0, 0)
    $ResSize = $ResSize[0]
    If $ResSize = 0 Then Return SetError(6, 0, 0)

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

    $GlobalMemoryBlock = DllCall("kernel32.dll", "int", "LoadResource", "int", $hInstance, "int", $InfoBlock)
    If @error Then Return SetError(7, 0, 0)
    $GlobalMemoryBlock = $GlobalMemoryBlock[0]
    If $GlobalMemoryBlock = 0 Then Return SetError(8, 0, 0)

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

    $MemoryPointer = DllCall("kernel32.dll", "int", "LockResource", "int", $GlobalMemoryBlock)
    If @error Then Return SetError(9, 0, 0)
    $MemoryPointer = $MemoryPointer[0]
    If $MemoryPointer = 0 Then Return SetError(10, 0, 0)

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

    If $DLL <> -1 Then _WinAPI_FreeLibrary($hInstance)
    If @error Then Return SetError(11, 0, 0)
    SetExtended($ResSize)
    Return $MemoryPointer
    EndFunc

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

    Func _ResourceGetAsBytes($ResName, $ResType = 10, $ResLang = 0, $DLL = -1)
    Local $ResPointer, $ResSize

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

    $ResPointer = _ResourceGet($ResName, $ResType, $ResLang, $DLL)
    If @error Then Return SetError(1, 0, 0)
    $ResSize = @extended
    Return DllStructCreate("byte[" & $ResSize & "]", $ResPointer)
    EndFunc

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

    Func _ResourceREAD($FileName, $ResName, $ResType = 10, $ResLang = 0, $DLL = -1) ; $RT_RCDATA = 10
    Local $ResStruct, $ResSize, $FileHandle
    $ResStruct = _ResourceGetAsBytes($ResName, $ResType, $ResLang, $DLL)
    If @error Then Return SetError(1, 0, 0)
    $ResSize = DllStructGetSize($ResStruct)
    If @error Then Return SetError(2, 0, 0)
    Return DllStructGetData($ResStruct, 1)
    EndFunc

    [/autoit]


    Gruß Snify

  • Jup, danke für deine Bemühungen...jeoch hab ich schon eine effziente Lösung...Danke jedoch noch mals :thumbup: