Icon From File

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Icon From File

    Hi,

    ich möchte ein Icon aus einer .exe Datei extrahieren und als .ico File abspeichern.

    In anderem Zusammenhang hat @RFG dazu auf die Icon.ExtractAssociatedIcon Methode hingewiesen.

    Damit kann man recht einfach ein Icon extrahieren:

    VB.NET-Quellcode

    1. Dim ico As Icon = Icon.ExtractAssociatedIcon(strExeSource)


    Will man das Icon in einer PictureBox (picIcon) anzeigen, dann kodiert man:

    VB.NET-Quellcode

    1. picIcon.Image = ico.ToBitmap


    Wenn man das Icon in eine .ico Datei speichern will, dann erreicht man das wie folgt:

    VB.NET-Quellcode

    1. Using fs = New IO.FileStream(strIconTarget, IO.FileMode.Create)
    2. ico.Save(fs)
    3. fs.Close()
    4. End Using


    Das klappt auch soweit. Die Icons werden fehlerfrei angezeigt und abgespeichert. Aber ...

    ... die gespeicherten Icons haben alle die gleiche Größe, nämlich 766 Bytes.

    Für einige kleine Icons ist das ausreichend, die werden korrekt angezeigt.

    Für andere Icons hingegen reicht das nicht aus, die sind wohl zu groß ... und dann gehen Farben und Zeichnungselemente verloren!

    Ich hab das mal exemplarisch für die Datei C:\Windows\System32\notepad.exe durchgeführt. (s.Anhang)

    Wie man sieht wird das Icon im Display ordentlich dargestellt. Das abgespeicherte Icon hingegen ist nur ein Schatten seiner selbst, wie man in der Vergrößerung deutlich erkennt.

    Mit der Speicherung liegt also irgendetwas im Argen.

    Hat jemand eine Idee was da falsch laufen könnte?

    LG
    Peter
    Bilder
    • IconFromfile.jpg

      143,36 kB, 650×400, 208 mal angesehen
    • IconFromfile2.jpg

      200,72 kB, 1.270×882, 163 mal angesehen

    Peter329 schrieb:

    Vergrößerung
    Ich hab mal ne Runde gespielt:

    VB.NET-Quellcode

    1. Dim strExeSource = "C:\Windows\Notepad.exe"
    2. Dim strIconTarget = "c:\temp\xxxx.ico"
    3. Dim ico As Icon = Icon.ExtractAssociatedIcon(strExeSource)
    4. Dim bmp = ico.ToBitmap
    5. bmp.Save(strIconTarget & ".png", Imaging.ImageFormat.Png)
    6. 'Using fs = New IO.FileStream(strIconTarget, IO.FileMode.Create)
    7. ' ico.Save(fs)
    8. ' fs.Close()
    9. 'End Using
    Das PNG sieht sehr ansprechend aus.
    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!
    PNG != ICO.
    Du kannst das Bitmap auch als Imaging.ImageFormat.Ico speichern und es sieht gut aus. Aber es ist kein "richtiges" .ico Format.
    Es gibt soweit ich weiß iein CodeProject Namens SaveIcon oder so. Am besten mal danach suchen

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Jau ... das .png sieht ganz manierlich aus. Aber wie bereits vermerkt, ist das eben kein .ico.

    Was auffällt, die .png Datei ist mit 2.653 Bytes mehr als dreimal so groß wie die .ico Datei. Ganz offensichtlich sind in der PictureBox mehr Einzelheiten enthalten als nachher in den .ico File geschrieben werden. Irgendwie klappt die Konvertierung da wohl nicht so richtig. Wenn man die .png Datei in ein vernünftiges .ico konvertieren könnte, dann wäre das ja schon mal gar nicht so schlecht.

    Nach dem CodeProject hab ich gesucht ... aber so richtig fündig bin ich nicht geworden.
    Bilder
    • IconFromfile3.jpg

      247,27 kB, 1.270×882, 166 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Ich vermute, dass sich ToBitmap() mit entsprechendem Bildformat das beste Icon heraussucht. Icons können mehrere "Layer" enthalten, also Symbole von verschiedener Größe oder Farbtiefe. Save() hingegen scheint sich offenbar nur den ersten Layer zu nehmen. Soweit meine Theorie dazu.

    Kann dazu jemand was sagen, oder bin ich auf dem Holzweg?
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Ich hab die Sache mit .ImageFormat.Icon ausprobiert.

    Das ist jetzt wesentlich besser! Das notepad.ico hat nun die gleiche Größe wie die .png Datei, nämlich 2.653 Bytes. Das Erscheinungsbild kommt dem Original wohl sehr nahe. Möglicherweise ist es sogar identisch.

    Ich hab das mit mehreren Icons ausprobiert ... und die Größe ist jetzt variabel, meist so zwischen 1000 - 2500 Bytes und die Icons sind fehlerfrei. Supi ... das reicht für meine Zwecke vollkommen aus.

    LG
    Peter

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Probier das ganze mal mit einem selbsterstellten Icon mit mehreren Ebenen, die werden leider nicht mit exportiert.
    Ressource -> Hinzufügen -> Neues Symbol. Da wird per default ein Icon mit 6 Ebenen erstellt.
    Icon.ExtractAssociatedIcon(strExeSource) bringt hier leider nur das, was der App zugeordnet ist, nicht aber die anderen. ;(
    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!
    Ich hatte mal Quick&Dirty eine Klasse gemacht um automatisiert Icons zu erstellen. Wenn du andere groessen brauchst, ist das leicht zu implementieren.
    daubnet.com/en/file-format-ico

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.IO
    3. Public Class CreateIcon
    4. Public Sub New(ByVal image As Bitmap, ByVal filename As String)
    5. Dim data0() As Byte = ToByteArray(Scale(image, 256))
    6. Dim data1() As Byte = GetBitmapData(Scale(image, 48))
    7. Dim data2() As Byte = GetBitmapData(Scale(image, 32))
    8. Dim data3() As Byte = GetBitmapData(Scale(image, 16))
    9. Dim l As New List(Of Byte)
    10. l.AddRange({0, 0, 1, 0})
    11. l.AddRange(BitConverter.GetBytes(CShort(4)))
    12. l.AddRange({0, 0, 0, 0, 1, 0, 32, 0})
    13. l.AddRange(BitConverter.GetBytes(CInt(data0.Length)))
    14. l.AddRange(BitConverter.GetBytes(CInt(70)))
    15. l.AddRange({48, 48, 0, 0, 1, 0, 32, 0})
    16. l.AddRange(BitConverter.GetBytes(CInt(data1.Length)))
    17. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length)))
    18. l.AddRange({32, 32, 0, 0, 1, 0, 32, 0})
    19. l.AddRange(BitConverter.GetBytes(CInt(data2.Length)))
    20. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + 40))) 'add 40 infoheader
    21. l.AddRange({16, 16, 0, 0, 1, 0, 32, 0})
    22. l.AddRange(BitConverter.GetBytes(CInt(data3.Length)))
    23. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + data2.Length + 40 + 40)))
    24. l.AddRange(data0)
    25. 'data1 infoheader
    26. l.AddRange(BitConverter.GetBytes(CInt(40)))
    27. l.AddRange(BitConverter.GetBytes(CInt(48)))
    28. l.AddRange(BitConverter.GetBytes(CInt(48 * 2)))
    29. l.AddRange({1, 0})
    30. l.AddRange(BitConverter.GetBytes(CShort(32)))
    31. l.AddRange(BitConverter.GetBytes(CInt(0)))
    32. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    33. l.AddRange(data1)
    34. 'data2 infoheader
    35. l.AddRange(BitConverter.GetBytes(CInt(40)))
    36. l.AddRange(BitConverter.GetBytes(CInt(32)))
    37. l.AddRange(BitConverter.GetBytes(CInt(32 * 2)))
    38. l.AddRange({1, 0})
    39. l.AddRange(BitConverter.GetBytes(CShort(32)))
    40. l.AddRange(BitConverter.GetBytes(CInt(0)))
    41. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    42. l.AddRange(data2)
    43. 'data3 infoheader
    44. l.AddRange(BitConverter.GetBytes(CInt(40)))
    45. l.AddRange(BitConverter.GetBytes(CInt(16)))
    46. l.AddRange(BitConverter.GetBytes(CInt(16 * 2)))
    47. l.AddRange({1, 0})
    48. l.AddRange(BitConverter.GetBytes(CShort(32)))
    49. l.AddRange(BitConverter.GetBytes(CInt(0)))
    50. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    51. l.AddRange(data3)
    52. File.WriteAllBytes(filename, l.ToArray)
    53. End Sub
    54. Private Function Scale(ByVal image As Bitmap, ByVal size As Integer) As Bitmap
    55. Using tmp As New Bitmap(size, size)
    56. Using G As Graphics = Graphics.FromImage(tmp)
    57. G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    58. G.DrawImage(image, 0, 0, size, size)
    59. Return CType(tmp.Clone(), Bitmap)
    60. End Using
    61. End Using
    62. End Function
    63. Private Function GetBitmapData(ByVal bmp As Bitmap) As Byte()
    64. bmp.RotateFlip(RotateFlipType.Rotate180FlipX)
    65. Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    66. Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat)
    67. Dim bytes(Math.Abs(bmpData.Stride) * bmp.Height - 1) As Byte
    68. System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, bytes, 0, bytes.Length)
    69. bmp.UnlockBits(bmpData)
    70. Return bytes
    71. End Function
    72. Private Function ToByteArray(ByVal image As Bitmap) As Byte()
    73. Dim converter As New ImageConverter()
    74. Return DirectCast(converter.ConvertTo(image, GetType(Byte())), Byte())
    75. End Function
    76. End Class
    And i think to myself... what a wonderfuL World!
    @Eddy ... wow ... das ist ja eine tolle Sache ! Damit kriege ich die bisher besten Icons hin !

    Der .ico file ist jetz 130 KB groß und wie man dem angehängten Screen Shot aus meinem Icon Editor entnimmt, sind die vier generierten Layouts wirklich super ! Also ganz herzlichen Dank für dein Coding ...

    Aber jetzt mal eine Frage ... CreateIcon ist ja als Klasse implementiert. Deshalb muss ich das Dingens instanzieren. Ich hab das wie folgt gemacht:

    VB.NET-Quellcode

    1. Dim hugo As New CreateIcon(CType(picIcon.Image, Bitmap), strIconTarget)


    Ist das denn so im Sinne des Erfinders ? Ich bitte um Nachsicht, wenn ich (wieder mal) gegen alle Regeln der Objektorientierung verstoßen haben sollte ... aber irgendwie fällt mir nix Besseres ein ! :)

    LG
    Peter
    Bilder
    • IconFromfile4.jpg

      187,42 kB, 632×544, 192 mal angesehen

    Peter329 schrieb:

    Also ganz herzlichen Dank für dein Coding ...


    Danke fuers Danke. Aber das hatte ich so noch rumliegen, nicht extra gemacht. Sollte eigendlich mal ein Icon-Editor werden, aus Zeitgruenden nie wirklich richtig angefangen, sieht mann ja nur minimal Funktional. So wie du das machst geht das OK, habe ich selbst nicht anders gemacht. Du kannst daraus aber auch etwas Statisches machen.

    Edit: @Peter329 So ist das ein wenig schoener. Dann brauchst du nur eine Instanz. Natuerlich noch schoener wenn man die Anzahl der Bilder und Groessen dynamisch macht.

    Was mir aber auffaelt, das du ein zu kleines Bild genommen hast fuer das Icon, sieht sehr gedehnt aus. Wenn das so klein aus Icon.ExtractAssociatedIcon rauskomt, versuch es mal mit der ExtractIconEx, da kannst du alle Bilder(Groessen) aus der PE bekommen.

    pinvoke.net/default.aspx/shell32.ExtractIconEx

    Nicht statisch
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.IO
    3. Public Class IconMaker
    4. Public Sub New()
    5. End Sub
    6. Public Sub MakeIcon(ByVal image As Bitmap, ByVal filename As String)
    7. Dim data0() As Byte = ToByteArray(Scale(Image, 256))
    8. Dim data1() As Byte = GetBitmapData(Scale(Image, 48))
    9. Dim data2() As Byte = GetBitmapData(Scale(Image, 32))
    10. Dim data3() As Byte = GetBitmapData(Scale(Image, 16))
    11. Dim l As New List(Of Byte)
    12. l.AddRange({0, 0, 1, 0})
    13. l.AddRange(BitConverter.GetBytes(CShort(4)))
    14. l.AddRange({0, 0, 0, 0, 1, 0, 32, 0})
    15. l.AddRange(BitConverter.GetBytes(CInt(data0.Length)))
    16. l.AddRange(BitConverter.GetBytes(CInt(70)))
    17. l.AddRange({48, 48, 0, 0, 1, 0, 32, 0})
    18. l.AddRange(BitConverter.GetBytes(CInt(data1.Length)))
    19. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length)))
    20. l.AddRange({32, 32, 0, 0, 1, 0, 32, 0})
    21. l.AddRange(BitConverter.GetBytes(CInt(data2.Length)))
    22. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + 40))) 'add 40 infoheader
    23. l.AddRange({16, 16, 0, 0, 1, 0, 32, 0})
    24. l.AddRange(BitConverter.GetBytes(CInt(data3.Length)))
    25. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + data2.Length + 40 + 40)))
    26. l.AddRange(data0)
    27. 'data1 infoheader
    28. l.AddRange(BitConverter.GetBytes(CInt(40)))
    29. l.AddRange(BitConverter.GetBytes(CInt(48)))
    30. l.AddRange(BitConverter.GetBytes(CInt(48 * 2)))
    31. l.AddRange({1, 0})
    32. l.AddRange(BitConverter.GetBytes(CShort(32)))
    33. l.AddRange(BitConverter.GetBytes(CInt(0)))
    34. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    35. l.AddRange(data1)
    36. 'data2 infoheader
    37. l.AddRange(BitConverter.GetBytes(CInt(40)))
    38. l.AddRange(BitConverter.GetBytes(CInt(32)))
    39. l.AddRange(BitConverter.GetBytes(CInt(32 * 2)))
    40. l.AddRange({1, 0})
    41. l.AddRange(BitConverter.GetBytes(CShort(32)))
    42. l.AddRange(BitConverter.GetBytes(CInt(0)))
    43. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    44. l.AddRange(data2)
    45. 'data3 infoheader
    46. l.AddRange(BitConverter.GetBytes(CInt(40)))
    47. l.AddRange(BitConverter.GetBytes(CInt(16)))
    48. l.AddRange(BitConverter.GetBytes(CInt(16 * 2)))
    49. l.AddRange({1, 0})
    50. l.AddRange(BitConverter.GetBytes(CShort(32)))
    51. l.AddRange(BitConverter.GetBytes(CInt(0)))
    52. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    53. l.AddRange(data3)
    54. File.WriteAllBytes(filename, l.ToArray)
    55. End Sub
    56. Private Function Scale(ByVal image As Bitmap, ByVal size As Integer) As Bitmap
    57. Using tmp As New Bitmap(size, size)
    58. Using G As Graphics = Graphics.FromImage(tmp)
    59. G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    60. G.DrawImage(image, 0, 0, size, size)
    61. Return CType(tmp.Clone(), Bitmap)
    62. End Using
    63. End Using
    64. End Function
    65. Private Function GetBitmapData(ByVal bmp As Bitmap) As Byte()
    66. bmp.RotateFlip(RotateFlipType.Rotate180FlipX)
    67. Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    68. Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat)
    69. Dim bytes(Math.Abs(bmpData.Stride) * bmp.Height - 1) As Byte
    70. System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, bytes, 0, bytes.Length)
    71. bmp.UnlockBits(bmpData)
    72. Return bytes
    73. End Function
    74. Private Function ToByteArray(ByVal image As Bitmap) As Byte()
    75. Dim converter As New ImageConverter()
    76. Return DirectCast(converter.ConvertTo(image, GetType(Byte())), Byte())
    77. End Function
    78. End Class


    statisch. Iconmaker.MakeIcon("","")
    Spoiler anzeigen

    Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.IO
    3. Public Class IconMaker
    4. Public Shared Sub MakeIcon(ByVal image As Bitmap, ByVal filename As String)
    5. Dim data0() As Byte = ToByteArray(Scale(image, 256))
    6. Dim data1() As Byte = GetBitmapData(Scale(image, 48))
    7. Dim data2() As Byte = GetBitmapData(Scale(image, 32))
    8. Dim data3() As Byte = GetBitmapData(Scale(image, 16))
    9. Dim l As New List(Of Byte)
    10. l.AddRange({0, 0, 1, 0})
    11. l.AddRange(BitConverter.GetBytes(CShort(4)))
    12. l.AddRange({0, 0, 0, 0, 1, 0, 32, 0})
    13. l.AddRange(BitConverter.GetBytes(CInt(data0.Length)))
    14. l.AddRange(BitConverter.GetBytes(CInt(70)))
    15. l.AddRange({48, 48, 0, 0, 1, 0, 32, 0})
    16. l.AddRange(BitConverter.GetBytes(CInt(data1.Length)))
    17. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length)))
    18. l.AddRange({32, 32, 0, 0, 1, 0, 32, 0})
    19. l.AddRange(BitConverter.GetBytes(CInt(data2.Length)))
    20. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + 40))) 'add 40 infoheader
    21. l.AddRange({16, 16, 0, 0, 1, 0, 32, 0})
    22. l.AddRange(BitConverter.GetBytes(CInt(data3.Length)))
    23. l.AddRange(BitConverter.GetBytes(CInt(70 + data0.Length + data1.Length + data2.Length + 40 + 40)))
    24. l.AddRange(data0)
    25. 'data1 infoheader
    26. l.AddRange(BitConverter.GetBytes(CInt(40)))
    27. l.AddRange(BitConverter.GetBytes(CInt(48)))
    28. l.AddRange(BitConverter.GetBytes(CInt(48 * 2)))
    29. l.AddRange({1, 0})
    30. l.AddRange(BitConverter.GetBytes(CShort(32)))
    31. l.AddRange(BitConverter.GetBytes(CInt(0)))
    32. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    33. l.AddRange(data1)
    34. 'data2 infoheader
    35. l.AddRange(BitConverter.GetBytes(CInt(40)))
    36. l.AddRange(BitConverter.GetBytes(CInt(32)))
    37. l.AddRange(BitConverter.GetBytes(CInt(32 * 2)))
    38. l.AddRange({1, 0})
    39. l.AddRange(BitConverter.GetBytes(CShort(32)))
    40. l.AddRange(BitConverter.GetBytes(CInt(0)))
    41. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    42. l.AddRange(data2)
    43. 'data3 infoheader
    44. l.AddRange(BitConverter.GetBytes(CInt(40)))
    45. l.AddRange(BitConverter.GetBytes(CInt(16)))
    46. l.AddRange(BitConverter.GetBytes(CInt(16 * 2)))
    47. l.AddRange({1, 0})
    48. l.AddRange(BitConverter.GetBytes(CShort(32)))
    49. l.AddRange(BitConverter.GetBytes(CInt(0)))
    50. l.AddRange({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    51. l.AddRange(data3)
    52. File.WriteAllBytes(filename, l.ToArray)
    53. End Sub
    54. Private Shared Function Scale(ByVal image As Bitmap, ByVal size As Integer) As Bitmap
    55. Using tmp As New Bitmap(size, size)
    56. Using G As Graphics = Graphics.FromImage(tmp)
    57. G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    58. G.DrawImage(image, 0, 0, size, size)
    59. Return CType(tmp.Clone(), Bitmap)
    60. End Using
    61. End Using
    62. End Function
    63. Private Shared Function GetBitmapData(ByVal bmp As Bitmap) As Byte()
    64. bmp.RotateFlip(RotateFlipType.Rotate180FlipX)
    65. Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    66. Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat)
    67. Dim bytes(Math.Abs(bmpData.Stride) * bmp.Height - 1) As Byte
    68. System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, bytes, 0, bytes.Length)
    69. bmp.UnlockBits(bmpData)
    70. Return bytes
    71. End Function
    72. Private Shared Function ToByteArray(ByVal image As Bitmap) As Byte()
    73. Dim converter As New ImageConverter()
    74. Return DirectCast(converter.ConvertTo(image, GetType(Byte())), Byte())
    75. End Function
    76. End Class



    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Eddy“ ()

    Supi ... der statische Aufruf gefällt mir dann sogar noch ein bissl besser. Wie gut, dass ich gerade vor ein paar Tagen gelernt habe, wie man eine "shared Function" aufruft. :)

    Alles in allem bin ich mit meiner Routine zum Extrahieren der Icons aus einer .exe Datei jetzt sehr zufrieden. Zumal das Ganze in gleicher Weise auch für .dll Dateien funktioniert. Ich bin hellauf begeistert !

    Herzlichen Dank an alle Ratgeber.

    LG
    Peter