VB.NET - ResourceLib Bitmaps speichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    VB.NET - ResourceLib Bitmaps speichern

    Guten Tag,
    ich möchte mit der Bibliothek "ResourceLib" mein eigenen "Resource Hacker" schreiben. Dieser sollte zunächst die Bitmaps aus einer externen Anwendung bekommen und abspeichern, aber dies funktioniert bereits nicht. Ich habe den Code dabei von dem Beispiel übernommen (sollte also eigentlich funktionieren, QUELLE: github.com/dblock/resourcelib/blob/master/Docs/Bitmap.md).
    Die Fehlermeldung, die ich dabei bekomme, finde ich nicht besonders hilfreich. "Der Wert darf nicht NULL sein."

    Code:

    VB.NET-Quellcode

    1. Dim path As String = IO.Path.Combine("C:\ORDNER", "DATEI.exe")
    2. Using vi As New ResourceInfo
    3. vi.Load(path)
    4. For Each rc As BitmapResource In vi(Kernel32.ResourceTypes.RT_BITMAP)
    5. rc.Bitmap.Image.Save("C:\ORDNER\" & rc.Name.ToString & ".bmp", Imaging.ImageFormat.Bmp)
    6. Next
    7. End Using


    Stelle ich davor eine IF-Anweisung auf nach "rc.Bitmap.Image IsNot Nothing" dann bricht der Debugger dort ab.
    Über die EXE-Datei selbst kann ich nur sagen, dass sie als Voraussetzung "Microsoft Visual C++ 2005 SP1 Redistributable Package" hat. Eine ältere Version der EXE-Datei lässt sich zwar Bilder entnehmen, jedoch in extrem schlechter Qualität und ebenfalls nur die Hälfte, die andere ist schwarz. Der "Resource Hacker" selbst schafft es bei beide EXE-Dateien, die Bitmaps ohne Probleme zu entnehmen.

    Ich habe erst heute in diesem Bereich angefangen, leider finde ich im Internet auch keine Beispiele zur der Bibliothek. Ebenfalls ist die Frage, ob die Bibliothek so umfangreich ist, oder ob man das nicht einfach selbst schreibt.

    Vielleicht weiß einer von Euch, wie ich das zum Laufen bringe.
    @noob98 Ressourcen zu extrahieren ist keine Hexerei, das geht über Reflection ganz easy.
    Sieh Dir mal dieses Beispiel an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Resources
    2. Imports System.Reflection
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim ass As Assembly
    6. Using dlg As New OpenFileDialog
    7. dlg.Filter = "EXE Files|*.exe|All files|*.*"
    8. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    9. Return
    10. End If
    11. ass = Assembly.LoadFile(dlg.FileName)
    12. End Using
    13. ' Liste aller Einzel-Quellen
    14. Dim allRes() = ass.GetManifestResourceNames
    15. For Each res In allRes
    16. Dim subDir = res
    17. Dim ioStream As System.IO.Stream = ass.GetManifestResourceStream(res)
    18. Using resReader As New ResourceReader(ioStream)
    19. readOutRes(resReader, subDir)
    20. ' close stream
    21. resReader.Close()
    22. End Using
    23. Next
    24. End Sub
    25. Private Sub readOutRes(resReader As ResourceReader, subDir As String)
    26. Dim path = "C:\Temp\Ressources\" & subDir
    27. System.IO.Directory.CreateDirectory(path)
    28. ' get enumerator for resourcestream
    29. Dim id As IDictionaryEnumerator = resReader.GetEnumerator
    30. ' iterate through resources
    31. While id.MoveNext
    32. ' Id.Key enthält Namen, ID.Value die Werte der resourcen
    33. If (TypeOf id.Value Is Bitmap) Then
    34. Dim bmp = DirectCast(id.Value, Bitmap)
    35. bmp.Save(String.Format("{0}\{1}.png", path, id.Key.ToString), Drawing.Imaging.ImageFormat.Png)
    36. End If
    37. End While
    38. End Sub
    39. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erstens vielen Dank!
    Zweitens funktioniert es nur leider nicht... (zumindest bei der EXE)
    Bei Load wird ausgelöst: "Ein Ausnahmefehler des Typs "System.BadImageFormatException" ist in mscorlib.dll aufgetreten.
    Zusätzliche Informationen: Im Modul wurde ein Assemblymanifest erwartet. (Ausnahme von HRESULT: 0x80131018)", obwohl es ganz bestimmt eine EXE-Datei ist...

    Außerdem wäre mein nächster Schritt, die Bitmap zu ersetzen. Wäre das auch so einfach?

    noob98 schrieb:

    mein nächster Schritt
    Poste zunächst die vollständige Aufgabenstellung.
    Nein, Du kannst nicht ieiner Exe ein anderes Bild unterjubeln.
    =====
    Mach Dir mal ne eigene Exe, die Bilder enthält, und teste daran meinen Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ​Poste zunächst die vollständige Aufgabenstellung.


    Antwort:
    ​mein eigenen "Resource Hacker"

    Sprich aus einer EXE-Datei die Bilder lesen UND bearbeiten, wenn aber das Lesen schon nicht funktioniert, muss ich garnicht erst anfangen, zu probieren ein Bitmap zu ersetzen...

    Der Code funktioniert ebenfalls nicht bei meiner eigenen EXE-Datei (Ordner sind leer, aber KEIN Fehler). Alle Bilder als Ressourcen hinzugefügt im Projekt. Das das aber nicht funktioniert war für mich kein Wunder, da selbst der "Resource Hacker" dies nicht schafft.

    P.S.
    Sorry ich bin zu doof zum richtigen zitieren.
    Hi
    es handelt sich um eine C++ Library. Mit der LoadResource-Methode wirst du derartige Ressourcen auslesen können, UpdateResource lässt das Ändern zu. Das ist aber keine triviale Geschichte. Lies dir vielleicht einfach die Beispiele zu Ressourcen durch, die dort verlinkt werden.
    RodFromGermanys Beispiel hilft dir nicht, da dieses nur bei verwalteten .Net Assemblies so funktioniert.

    Sieh dich nach .Net-Codes um, die das verwenden, da gibt's bestimmt was zu.

    Viele Grüße
    ~blaze~
    Okay, ich bekomme es nicht hin. Es gibt zwar die Funktion "Find", dass basiert aber darauf, dass man den Namen der gewünschten Ressource kennt. Nun möchte ich aber nicht BruteForce mäßig jeden möglichen Dateinamen abchecken. Ist es möglich alle Bitmaps auszulesen? (Ich wollte kein neuen Thread auf machen...)