Dll lesen

  • Hallo Zusammen,

    wie kann ich aus einer dll eine StringTable lesen? Also nur von einer bestimmten ID und wie kann ich darein schreiben?
    Hat jemand eine Funktion dazu? Vlt kanns mir jmd erklären?
    Ich versuche gerade eine .ini-Datei zu ersetzen, da in der DLL auch Bilder gespeichert werden sollen.

    Lieben Gruß und vielen Dank, Anna

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

    Einmal editiert, zuletzt von AnnaM (28. November 2012 um 11:10)

  • Hi,

    MyDll.rc

    Spoiler anzeigen

    resource.h

    Spoiler anzeigen
    Code
    #ifndef IDC_STATIC
    #define IDC_STATIC (-1)
    #endif
    
    
    #define IDS_STRING1                         	40000
    #define IDS_STRING2                         	40001


    Dll kompilieren ...

    LoadStringDemo.au3

    Spoiler anzeigen
    [autoit]

    ; Aus resource.h
    Global Const $IDS_STRING1 = 40000
    Global Const $IDS_STRING2 = 40001

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

    Global $hDll
    Global $sString

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

    $hDll = LoadLibrary ("MyDll.dll")

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

    ;...
    ;...
    LoadString ($hDll, $IDS_STRING1, $sString, 260)
    MsgBox ($MB_OK, "LoadString Demo", $sString)
    ;...
    ;...

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

    FreeLibrary ($hDll)

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

    Func LoadString ($hInstance, $uID, ByRef $lpBuffer, $nBufferMax)

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

    Local $aRes = DllCall ($user32dll, "INT", "LoadStringW", _
    "HANDLE", $hInstance, _
    "UINT", $uID, _
    "WSTR", $lpBuffer, _
    "INT", $nBufferMax)
    $lpBuffer = $aRes[3]
    Return $aRes[0]

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

    EndFunc

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

    Func LoadLibrary ($lpFileName)

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

    Local $aRes = DllCall ("kernel32.dll", "HANDLE", "LoadLibraryW", _
    "WSTR", $lpFileName)
    Return $aRes[0]

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

    EndFunc

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

    Func FreeLibrary ($hModule)

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

    Local $aRes = DllCall ("kernel32.dll", "BOOL", "FreeLibrary", _
    "HANDLE", $hModule)
    Return $aRes[0]

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

    EndFunc

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


    LoadString function
    LoadLibrary function
    FreeLibrary function


    Gruß
    Greenhorn


  • Hallo, ich finde dein Skript wirklich sehr interessant. Das eröffnet mir neue Möglichkeiten, aber ich verstehe es leider nicht ganz:
    1. Warum schreibst du die Funktionen LoadLibrary und FreeLibrary neu(DllOpen, DllClose)?
    2. Woher weisst du, dass der String in AutoIt 260 Zeichen groß ist?

    [autoit]

    LoadString ($hDll, $IDS_STRING1, $sString, 260)

    [/autoit]
  • Hi,

    zu 1.
    Sieh dir den Rückgabewert von DllOpen an, und den von LoadLibrary, dann weißt du warum. ;)

    zu 2.
    Ich weiß es nicht. AutoIt-Strings können eine max. Länge von 'was weiß ich' haben. Diese Zahl könntest Du genausogut nehmen.


    Gruß
    Greenhorn


  • Auf jeden Fall besten Dank. Ich werde ich so einmal ausprobieren. :)

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko: