Seite 1 von 1

Ungültige ImageID ?

Verfasst: 13.03.2018 12:01
von silbersurfer
Hallo Leute,
heute bin ich auf ein Problem gestoßen, was ich mir nicht so richtig erklären kann.
Dazu hier ein lauffähiger code meiner Einleseroutine, welche eigendlich tadelos laufen sollte !
Nur kommt es wenn ich ein großes Verzeichnis einlese, zu einen merkwürdigen Fehler den ich nicht ganz folgen kann,
AddGadgetItem(gadget, -1, Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Dateien()\ImageID)
Fehlermeldung: Das angebebene ImageID ist ungültig
zumal dieser erst beim zweiten mal vom einlesen auftritt ????
Ich hoffe das ihr mir da weiter helfen könnt.

In diesen Beispiel habe ich das System32 Verzeichnis gewählt, da dort sehr viele Dateien enthalten sind.

Edit: Jetzt kommt es nicht mehr zu dem beschrieben Fehler, Code mit DestroyIcon_(Icon\hIcon) erweitert.
Danke allen nochmal für die hilfe, ist hiermit erledigt!

Code: Alles auswählen

EnableExplicit

Structure Datei
   Datei.s
   Adatum.s
   Dsize.i
   Typ.s
   ImageID.i
   Icon.i
EndStructure

NewList Dateien.Datei()
NewList Verzeichnis.Datei()
Define ListIconGadget.i
Define FolderIcon
Define Draw
;Folder Icon Extractieren
ExtractIconEx_("shell32.dll",3,0,@FolderIcon, 1)
CreateImage(1,32,32)
Draw = StartDrawing(ImageOutput(1))
Box(0,0,32,32,RGB(255,255,255))
DrawIcon_(Draw,0,0,FolderIcon)
StopDrawing()

   Procedure Im_VerzeichnisEinlesen   (Gadget,Paht.s)
      Shared Verzeichnis(),Dateien()
      Protected PahtUndDatei.s,info.SHFILEINFO, Icon.SHFILEINFO,FileName.s
       If ExamineDirectory(0,paht, "*.*")
         ;einträge in Gadgetlist sowie Structlisten löschen
         ClearGadgetItems(gadget)
         ClearList(Verzeichnis())   :   ClearList(Dateien())
         ;Verzeichnis öffnen und einlesen
            While NextDirectoryEntry(0)
               FileName = DirectoryEntryName(0)
               PahtUndDatei=Paht+FileName
               ;auslesen der Dateitypen / Icon´s
               SHGetFileInfo_(PahtUndDatei, #Null, @info.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_TYPENAME)
               ;Ordner in liste eintragen
               If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory And FileName<>"."
                  AddElement(Verzeichnis())
                  Verzeichnis()\Datei      =FileName
                  Verzeichnis()\Adatum   =FormatDate("%dd.%mm.%yyyy",DirectoryEntryDate(0,#PB_Date_Modified))
                  Verzeichnis()\Typ      =PeekS(@info\szTypeName,80)
                  Verzeichnis()\ImageID=ImageID(1)
               ;dateien im liste eintragen   
               ElseIf FileName<>"."
                  AddElement(Dateien())
                  Dateien()\Datei         =FileName
                  Dateien()\Adatum      =FormatDate("%dd.%mm.%yyyy",DirectoryEntryDate(0,#PB_Date_Modified))
                  Dateien()\Typ              =PeekS(@info\szTypeName,80)
                  Dateien()\Dsize         =DirectoryEntrySize(0)/1024+1
                  Dateien()\ImageID      =Icon\hIcon
               EndIf
            Wend
         ;Ordner und Dateienliste sortieren
         SortStructuredList(Verzeichnis()   , #PB_Sort_Ascending, OffsetOf(Datei\Datei), TypeOf(Datei\Datei))
         SortStructuredList(Dateien()         , #PB_Sort_Ascending, OffsetOf(Datei\Datei), TypeOf(Datei\Datei))
         ;listen übergeben an das ListGadget
         SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #False, 0)
         ForEach Verzeichnis()
            AddGadgetItem(gadget, -1,Verzeichnis()\Datei+Chr(10)+Verzeichnis()\Adatum+Chr(10)+Verzeichnis()\Typ,Verzeichnis()\ImageID)
         Next
         ForEach Dateien()
         	SHGetFileInfo_(Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
         	AddGadgetItem(gadget, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Icon\hIcon)
         	; wichtig verhindert ein Handle overflow (gibt wieder alles frei)
         	DestroyIcon_(Icon\hIcon) 
         Next
         SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #True, 0)
      Else
         ;falls das verzeichnis gelesen werden kann
         MessageRequester("Error","Kann das angebene Verzeichnis nicht öffnen: "+paht,0)
       EndIf         
    EndProcedure
   
If OpenWindow(0, 100, 200, 500, 400, "PureBasic - FileSystem Example mit Iconextract / Filetypenextract",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)   
   StringGadget  (0,  5, 10, 425, 24, "C:\Windows\System32\")
   ButtonGadget  (1, 435, 10, 60 , 24, "List")
     ListIconGadget=ListIconGadget(#PB_Any, 5, 40, 490, 350, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(ListIconGadget, 1, "Änderungsdatum", 100)
   AddGadgetColumn(ListIconGadget, 2, "Typ", 90)
   AddGadgetColumn(ListIconGadget, 3, "Größe", 80)   
   Repeat
      Define Event = WaitWindowEvent()
         
      If Event = #PB_Event_Gadget
         If EventGadget() = 1
            Im_VerzeichnisEinlesen(ListIconGadget,GetGadgetText(0))

         EndIf
      EndIf
   Until Event = #PB_Event_CloseWindow
EndIf
End 
Gruß Silbersurfer

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 12:35
von hjbremer
Füge Zeile 53 Debug FileName + Icon\hIcon ein

SHGetFileInfo_(PahtUndDatei, #Null, @Icon ..... liefert irgendwie irgendwann null fürs Icon

Abhilfe: Abfrage ob größer null und Dummy Icon angeben, oder ....

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 12:42
von Bisonte
Das gleiche hier.

Kann es sein, dass Du Windows 10 benutzt ?. Ich habe festgestellt, es passiert im System32 Ordner bei einigen PNG Dateien...
Das Problem wird wohl das "@" Symbol am Anfang des Dateinamens sein. Tippe ich jetzt mal drauf...

Edit: @hjbremer : Das hatte ich auch vermutet. Allerdings ist die Ausgabe : [Debug] 464115 : @AudioToastIcon.png
Also ImageID und Dateiname...

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 13:03
von silbersurfer
@hjbremer
SHGetFileInfo_(PahtUndDatei, #Null, @Icon ..... liefert irgendwie irgendwann null fürs Icon
das ist ja das merkwürdige, da es beim ersten durchlauf nicht zu diesem Fehler kommt
Bei "Debug Daten()\ImageID" wird irgendwann nur noch 0 zurückgegeben, das kann doch nicht sein?

@Bisonte
Kann es sein, dass Du Windows 10 benutzt ?
Ja Ich arbeite mit Windows 10

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 13:24
von _JON_
Könnte sein das Du schon das GDI limit des Processes erreicht hast.

Google mal nach SHGFI_SYSICONINDEX und system image list.

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 14:17
von silbersurfer
@_JON_
Könnte sein das Du schon das GDI limit des Processes erreicht hast.
und wie könnte man diese verhindern ?

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 14:37
von ts-soft
Da fehlt in jedem Fall ein "DestroyIcon_(?)" an geeigneter Stelle, ansonsten haben wir mehr Handles als erlaubt. Wird ja auch nicht mehr gebraucht, nach Erstellung einer ImageID()

Woher ich das weiß? Weil dasselbe Problem hatte ich vor Jahren mit meinem jaCommander :mrgreen:

Re: Ungültige ImageID ? "Gelöst"

Verfasst: 13.03.2018 14:43
von silbersurfer
@ts-soft :allright: :allright: :allright: :allright:
Da fehlt in jedem Fall ein "DestroyIcon_(?)
ja stimmt, habe ich gerade im Englischen Forum gefunden und eingebaut
http://www.purebasic.fr/english/viewtop ... 12&t=35696

Edit: so geht es nicht ?????????

Code: Alles auswählen

			ForEach Dateien()
				AddGadgetItem(gadget, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Dateien()\ImageID)
				DestroyIcon_(Dateien()\ImageID)
			Next
aber so: warum ich nicht nachträglich das Icon aus der Structur Freigeben kann versteh ich jetzt nicht

Code: Alles auswählen

			ForEach Dateien()
				SHGetFileInfo_(Quellenfolder+Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
				AddGadgetItem(Activeliste, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" Kb",Icon\hIcon)
				DestroyIcon_(Icon\hIcon)
			Next 

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 15:00
von Fluid Byte
Ist deinen 45 Smileys zu entnehmen das es jetzt funktioniert? Ich bekomme weiterhin den gleichen Fehler.

Re: Ungültige ImageID ?

Verfasst: 13.03.2018 15:23
von silbersurfer
@Fluid Byte
Ist deinen 45 Smileys zu entnehmen das es jetzt funktioniert?
ja es funzt nun, hast du meinen Edit gelesen Fluid Byte

es geht nur wenn ich in der selben schleife einlese und dann auch gleich freigebe " Warum auch immer ?"

Code: Alles auswählen

         ForEach Dateien()
            SHGetFileInfo_(Quellenfolder+Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
            AddGadgetItem(Activeliste, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" Kb",Icon\hIcon)
            DestroyIcon_(Icon\hIcon)
         Next 
den anderen natürlich löschen aus der Procedure

Code: Alles auswählen

SHGetFileInfo_(pahtunddatei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)