Ungültige ImageID ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Ungültige ImageID ?

Beitrag 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
Zuletzt geändert von silbersurfer am 13.03.2018 22:37, insgesamt 1-mal geändert.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Ungültige ImageID ?

Beitrag 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 ....
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Ungültige ImageID ?

Beitrag 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...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Ungültige ImageID ?

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Ungültige ImageID ?

Beitrag von _JON_ »

Könnte sein das Du schon das GDI limit des Processes erreicht hast.

Google mal nach SHGFI_SYSICONINDEX und system image list.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Ungültige ImageID ?

Beitrag von silbersurfer »

@_JON_
Könnte sein das Du schon das GDI limit des Processes erreicht hast.
und wie könnte man diese verhindern ?
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ungültige ImageID ?

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

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

Beitrag 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 
Zuletzt geändert von silbersurfer am 13.03.2018 15:18, insgesamt 1-mal geändert.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Ungültige ImageID ?

Beitrag von Fluid Byte »

Ist deinen 45 Smileys zu entnehmen das es jetzt funktioniert? Ich bekomme weiterhin den gleichen Fehler.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Ungültige ImageID ?

Beitrag 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)
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten