<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SHGetFileInfo komme nicht weiter...]]></title><description><![CDATA[<p>Im VCL Forum kann mir wohl momentan keiner helfen, vlt. hat es ja doch mehr mit API zu tun, deswegen versuche ich nun mal hier mein Glück.</p>
<p>Ich hole nun mit SHGetFileInfo ein Handle zu der SystemImage List, so wie ich es hier im Forum gesehn hatte.<br />
Nun habe ich aber das Problem, dass nicht alle Icons angezeigt werden, wie es sein sollte. Hauptsächlich fehlen die Ordner-Icons und Icons von .ink und .exe Dateien.</p>
<p>Ich habe mir auch mal das Beispiel Programm von der Seite <a href="http://www.catch22.net/tuts/sysimg.asp" rel="nofollow">http://www.catch22.net/tuts/sysimg.asp</a> mal runtergeladen und ausgeführt.</p>
<p>(Hinweis: Ich benutze den BCB5)</p>
<p>Das Programm zeigt ja meine komplette SystemImageList.<br />
Wenn ich das Programm nun in Einzelschritten durchlaufen lasse, und mir einmal den Wert von iIcon anschaue, ist der Wert bei Ordner immer der Wert 3.<br />
In meiner ImageList die geladen werden, sind aber nur 5 oder 6 Icons, jenachdem welchen Ordner ich wohl aufliste.<br />
Auf jeden Fall bekommen meine Ordner ein Icon für &quot;unbekannte&quot; dateien zugeordnet.</p>
<p>Ich habe irgendwie so im Gefühl, dass mit der Zeile:</p>
<pre><code class="language-cpp">ImageHandle = SHGetFileInfo(&quot;C:\\&quot;,0,&amp;FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);

     SendMessage(list_Left[0]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);

//das gleiche dann auch mit LargeIcon
</code></pre>
<p>gar nicht die ganze Liste geladen wird. Ich dachte die komplette Liste wird geladen und meiner ListView zugeordnet, wo ich dann mit FileInfo.iIcon den Index des Icons bekomme und diesen dann ausgeben kann.</p>
<p>Ich weiß da nicht weiter, auch die Beispiele hier im Forum haben mir nicht weiter geholfen.<br />
Hier nun einmal der Code:</p>
<pre><code class="language-cpp">THandle ImageHandle;
SHFILEINFO FileInfo;
HANDLE fHandle;          //DateiHandle Var. festlegen
WIN32_FIND_DATA wfd;         //WIN32_FIND_DATA Var. festlegen

fHandle=FindFirstFile(&quot;C:\\*&quot;,&amp;wfd);      //FileHandle zuweisen RootVerzeichnis C*

ImageHandle = SHGetFileInfo(&quot;C:\\&quot;,0,&amp;FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);

//Habe auch hier mal anstatt C:\\ mal nichts oder nur C eingeben, kommt eigentlich das gleiche Ergebnis bei raus.

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);

ImageHandle = SHGetFileInfo(&quot;C:\\&quot;, 0, &amp;FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_NORMAL,ImageHandle);

 while(FindNextFile(fHandle,&amp;wfd)){    //Ordner durchsuchen

         if(wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY){  //Ist das gefundene Objekt ein Ordner?

        iDirectorys++; //Gefundene Anzahl an Ordnern um 1 erhöhen

       //Eintragen der Ordner

       TListItem *newItem; //Ein neues ListItem-Objekt erzeugen

    SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

           // List Struktur:
           // Dateiname,Erweiterung,Größe,Datum+Zeit

           newItem=list_Left[0]-&gt;Items-&gt;Add(); //Neus Item der Liste hinzufügen
           newItem-&gt;ImageIndex = FileInfo.iIcon;  //Icon Index
           newItem-&gt;Caption = wfd.cFileName;   //Den gefundenen Namen ausgeben
           newItem-&gt;SubItems-&gt;Add(&quot;--&quot;);       //Erweiterung angeben (bei Ordnern --)
           newItem-&gt;SubItems-&gt;Add(&quot;&lt;DIR&gt;&quot;);    //Größe angeben (Bei Ordnern &lt;DIR&gt;

           // Datum und Zeit von &quot;Zuletzt Geändert&quot;

           SYSTEMTIME stUTC, stL;  //Systemtime Variablen festlegen

           FileTimeToSystemTime(&amp;wfd.ftLastWriteTime, &amp;stUTC);  // Abspeicherung der Systemtime in stUTC
                                                                // aus WIN32_FIND_DATA.ftLastWriteTime

           SystemTimeToTzSpecificLocalTime(NULL, &amp;stUTC, &amp;stL); //Systemzeit zur Localzeit stL umwandeln

           //Variablen für die Datum/Zeit ausgabe
           AnsiString asDate, asDay, asMonth, asYear, asHour, asMinute;

          // Prüfen ob der Zahlenwert unter 10 liegt. Wenn ja, dann eine null Anfügen

           if(stL.wDay &lt;=9){ asDay=&quot;0&quot;; }
            asDay += IntToStr(stL.wDay);      //Tag

           if(stL.wMonth &lt;=9){ asMonth=&quot;0&quot;; }
           asMonth += IntToStr(stL.wMonth);   //Monat

           if(stL.wHour &lt;=9){ asHour=&quot;0&quot;; }
           asHour += IntToStr(stL.wHour);     //Stunde

           if(stL.wMinute &lt;=9){ asMinute=&quot;0&quot;; }
           asMinute += IntToStr(stL.wMinute);  //Minute

           asYear = IntToStr(stL.wYear);      //Jahr

           // Zusammensetzung des Datum/Zeit Strings mit allen Werten
           // Bsp.: 30.07.2005 12:43
           asDate = asDay + &quot;.&quot; + asMonth + &quot;.&quot; + asYear + &quot;  &quot; + asHour + &quot;:&quot; + asMinute;

           newItem-&gt;SubItems-&gt;Add(asDate);  //Neues Item &quot;Datum&quot; entgülig der ListBox hinzufügen

         }
         else{ // Ist das gefunde Objekt eine Datei? Dann hinzufügen

            iSize.Length=iSize.Length + 1;
            asFileName.Length=asFileName.Length + 1;
            asFileName[asFileName.Length-1] = wfd.cFileName;
            iSize[iSize.Length-1] = wfd.nFileSizeLow;

           TListItem *newItem; //Ein neues ListItem-Objekt erzeugen

        SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

           // List Struktur:
           // Dateiname,Erweiterung,Größe,Datum+Zeit

           newItem=list_Left[0]-&gt;Items-&gt;Add(); //Neus Item der Liste hinzufügen
           newItem-&gt;ImageIndex = FileInfo.iIcon;
           newItem-&gt;Caption = wfd.cFileName;   //Den geundenen Namen ausgeben
           newItem-&gt;SubItems-&gt;Add(&quot;--&quot;);       //Erweiterung angeben (bei Ordnern --)
           newItem-&gt;SubItems-&gt;Add(&quot;FILE&quot;);    //Größe angeben (Bei Ordnern &lt;DIR&gt;

         }
      }FindClose(fHandle);
</code></pre>
<p>Ich denke irgendwie, das mit</p>
<pre><code class="language-cpp">SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
</code></pre>
<p>vor der Ausgabe der Dateien, das Icon an der letzten Stelle in der ImageList geschrieben wird.</p>
<p>Weiß echt nicht weiter?<br />
Vlt. verstehen ich auch nur irgendetwas falsch. Währe sehr nett wenn mir einer Helfen könnte.</p>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129081/shgetfileinfo-komme-nicht-weiter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 20:23:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129081.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Dec 2005 22:09:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SHGetFileInfo komme nicht weiter... on Fri, 09 Dec 2005 22:09:31 GMT]]></title><description><![CDATA[<p>Im VCL Forum kann mir wohl momentan keiner helfen, vlt. hat es ja doch mehr mit API zu tun, deswegen versuche ich nun mal hier mein Glück.</p>
<p>Ich hole nun mit SHGetFileInfo ein Handle zu der SystemImage List, so wie ich es hier im Forum gesehn hatte.<br />
Nun habe ich aber das Problem, dass nicht alle Icons angezeigt werden, wie es sein sollte. Hauptsächlich fehlen die Ordner-Icons und Icons von .ink und .exe Dateien.</p>
<p>Ich habe mir auch mal das Beispiel Programm von der Seite <a href="http://www.catch22.net/tuts/sysimg.asp" rel="nofollow">http://www.catch22.net/tuts/sysimg.asp</a> mal runtergeladen und ausgeführt.</p>
<p>(Hinweis: Ich benutze den BCB5)</p>
<p>Das Programm zeigt ja meine komplette SystemImageList.<br />
Wenn ich das Programm nun in Einzelschritten durchlaufen lasse, und mir einmal den Wert von iIcon anschaue, ist der Wert bei Ordner immer der Wert 3.<br />
In meiner ImageList die geladen werden, sind aber nur 5 oder 6 Icons, jenachdem welchen Ordner ich wohl aufliste.<br />
Auf jeden Fall bekommen meine Ordner ein Icon für &quot;unbekannte&quot; dateien zugeordnet.</p>
<p>Ich habe irgendwie so im Gefühl, dass mit der Zeile:</p>
<pre><code class="language-cpp">ImageHandle = SHGetFileInfo(&quot;C:\\&quot;,0,&amp;FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);

     SendMessage(list_Left[0]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);

//das gleiche dann auch mit LargeIcon
</code></pre>
<p>gar nicht die ganze Liste geladen wird. Ich dachte die komplette Liste wird geladen und meiner ListView zugeordnet, wo ich dann mit FileInfo.iIcon den Index des Icons bekomme und diesen dann ausgeben kann.</p>
<p>Ich weiß da nicht weiter, auch die Beispiele hier im Forum haben mir nicht weiter geholfen.<br />
Hier nun einmal der Code:</p>
<pre><code class="language-cpp">THandle ImageHandle;
SHFILEINFO FileInfo;
HANDLE fHandle;          //DateiHandle Var. festlegen
WIN32_FIND_DATA wfd;         //WIN32_FIND_DATA Var. festlegen

fHandle=FindFirstFile(&quot;C:\\*&quot;,&amp;wfd);      //FileHandle zuweisen RootVerzeichnis C*

ImageHandle = SHGetFileInfo(&quot;C:\\&quot;,0,&amp;FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);

//Habe auch hier mal anstatt C:\\ mal nichts oder nur C eingeben, kommt eigentlich das gleiche Ergebnis bei raus.

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);

ImageHandle = SHGetFileInfo(&quot;C:\\&quot;, 0, &amp;FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_NORMAL,ImageHandle);

 while(FindNextFile(fHandle,&amp;wfd)){    //Ordner durchsuchen

         if(wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY){  //Ist das gefundene Objekt ein Ordner?

        iDirectorys++; //Gefundene Anzahl an Ordnern um 1 erhöhen

       //Eintragen der Ordner

       TListItem *newItem; //Ein neues ListItem-Objekt erzeugen

    SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

           // List Struktur:
           // Dateiname,Erweiterung,Größe,Datum+Zeit

           newItem=list_Left[0]-&gt;Items-&gt;Add(); //Neus Item der Liste hinzufügen
           newItem-&gt;ImageIndex = FileInfo.iIcon;  //Icon Index
           newItem-&gt;Caption = wfd.cFileName;   //Den gefundenen Namen ausgeben
           newItem-&gt;SubItems-&gt;Add(&quot;--&quot;);       //Erweiterung angeben (bei Ordnern --)
           newItem-&gt;SubItems-&gt;Add(&quot;&lt;DIR&gt;&quot;);    //Größe angeben (Bei Ordnern &lt;DIR&gt;

           // Datum und Zeit von &quot;Zuletzt Geändert&quot;

           SYSTEMTIME stUTC, stL;  //Systemtime Variablen festlegen

           FileTimeToSystemTime(&amp;wfd.ftLastWriteTime, &amp;stUTC);  // Abspeicherung der Systemtime in stUTC
                                                                // aus WIN32_FIND_DATA.ftLastWriteTime

           SystemTimeToTzSpecificLocalTime(NULL, &amp;stUTC, &amp;stL); //Systemzeit zur Localzeit stL umwandeln

           //Variablen für die Datum/Zeit ausgabe
           AnsiString asDate, asDay, asMonth, asYear, asHour, asMinute;

          // Prüfen ob der Zahlenwert unter 10 liegt. Wenn ja, dann eine null Anfügen

           if(stL.wDay &lt;=9){ asDay=&quot;0&quot;; }
            asDay += IntToStr(stL.wDay);      //Tag

           if(stL.wMonth &lt;=9){ asMonth=&quot;0&quot;; }
           asMonth += IntToStr(stL.wMonth);   //Monat

           if(stL.wHour &lt;=9){ asHour=&quot;0&quot;; }
           asHour += IntToStr(stL.wHour);     //Stunde

           if(stL.wMinute &lt;=9){ asMinute=&quot;0&quot;; }
           asMinute += IntToStr(stL.wMinute);  //Minute

           asYear = IntToStr(stL.wYear);      //Jahr

           // Zusammensetzung des Datum/Zeit Strings mit allen Werten
           // Bsp.: 30.07.2005 12:43
           asDate = asDay + &quot;.&quot; + asMonth + &quot;.&quot; + asYear + &quot;  &quot; + asHour + &quot;:&quot; + asMinute;

           newItem-&gt;SubItems-&gt;Add(asDate);  //Neues Item &quot;Datum&quot; entgülig der ListBox hinzufügen

         }
         else{ // Ist das gefunde Objekt eine Datei? Dann hinzufügen

            iSize.Length=iSize.Length + 1;
            asFileName.Length=asFileName.Length + 1;
            asFileName[asFileName.Length-1] = wfd.cFileName;
            iSize[iSize.Length-1] = wfd.nFileSizeLow;

           TListItem *newItem; //Ein neues ListItem-Objekt erzeugen

        SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

           // List Struktur:
           // Dateiname,Erweiterung,Größe,Datum+Zeit

           newItem=list_Left[0]-&gt;Items-&gt;Add(); //Neus Item der Liste hinzufügen
           newItem-&gt;ImageIndex = FileInfo.iIcon;
           newItem-&gt;Caption = wfd.cFileName;   //Den geundenen Namen ausgeben
           newItem-&gt;SubItems-&gt;Add(&quot;--&quot;);       //Erweiterung angeben (bei Ordnern --)
           newItem-&gt;SubItems-&gt;Add(&quot;FILE&quot;);    //Größe angeben (Bei Ordnern &lt;DIR&gt;

         }
      }FindClose(fHandle);
</code></pre>
<p>Ich denke irgendwie, das mit</p>
<pre><code class="language-cpp">SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
</code></pre>
<p>vor der Ausgabe der Dateien, das Icon an der letzten Stelle in der ImageList geschrieben wird.</p>
<p>Weiß echt nicht weiter?<br />
Vlt. verstehen ich auch nur irgendetwas falsch. Währe sehr nett wenn mir einer Helfen könnte.</p>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938578</guid><dc:creator><![CDATA[ThorstenSteinberg]]></dc:creator><pubDate>Fri, 09 Dec 2005 22:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to SHGetFileInfo komme nicht weiter... on Sat, 10 Dec 2005 08:07:25 GMT]]></title><description><![CDATA[<p>kann mir hier auch keiner weiterhelfen?</p>
<p>gruß<br />
thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938671</guid><dc:creator><![CDATA[ThorstenSteinberg]]></dc:creator><pubDate>Sat, 10 Dec 2005 08:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to SHGetFileInfo komme nicht weiter... on Sat, 10 Dec 2005 08:16:54 GMT]]></title><description><![CDATA[<p>Du hast zuviel Text und zu viel Code geschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938675</guid><dc:creator><![CDATA[definitiv]]></dc:creator><pubDate>Sat, 10 Dec 2005 08:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to SHGetFileInfo komme nicht weiter... on Sat, 10 Dec 2005 08:32:31 GMT]]></title><description><![CDATA[<p>Also dann versuche ich mich mal kurz zu fasssen.</p>
<p>Ich möchte ein Verzeichnis mit dessen Inhalt in einer TListView ausgeben, mit den dazugehörigen Icons und Ordner- bzw. Dateinamen.</p>
<p>Ich habe nun nur das Problem, dass mir keine Icons für Ordner und ein paar andere wie .exe oder .ink nicht ausgegeben werden.</p>
<p>So die SystemIcons hinzufügen:</p>
<pre><code class="language-cpp">ImageHandle = SHGetFileInfo(&quot;C:\\&quot;,0,&amp;FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);

//Habe auch hier mal anstatt C:\\ mal nichts oder nur C eingeben, kommt eigentlich das gleiche Ergebnis bei raus.

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);

ImageHandle = SHGetFileInfo(&quot;C:\\&quot;, 0, &amp;FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

SendMessage(list_Left[i_AktPos]-&gt;Handle, LVM_SETIMAGELIST, LVSIL_NORMAL,ImageHandle);
</code></pre>
<p>Dann bei der Ausgabe der Daten in der ListView wollte ich so die Icons bzw. den Index laden:</p>
<pre><code class="language-cpp">SHGetFileInfo(wfd.cFileName,0,&amp;FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
</code></pre>
<p>Was ist daran nun verkehrt?</p>
<p>(Hoffe is kurz genug so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )<br />
(Hinweis noch: Benutzte BCB 5)<br />
Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938678</guid><dc:creator><![CDATA[ThorstenSteinberg]]></dc:creator><pubDate>Sat, 10 Dec 2005 08:32:31 GMT</pubDate></item></channel></rss>