Announcement

Collapse
No announcement yet.

WIN32 API

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WIN32 API

    Hallo

    Ich versuche gerade API-Funktionen(SHFILEINFO, SHGetFileInfo usw.) zu verwenden um eine TListView mit Daten aufzufüllen, so wie das beim Explorer passiert. Nur erkennt der C++Builder die Funktionen nicht. Ich weiß nicht welche Headerdatei oder .hpp-Datei ich ins Projekt einbinden muß. Vielleicht kann mir einer von euch sagen was ich machen muß (ich hab schon alles probiert, komme einfach nicht weiter). Oder vielleicht kann mir jemand eine Routine zeigen bei der ich das Problem auch ohne WIN32 API schaffe. Danke

  • #2
    Hallo, diese Information verbirgt sich in der Hilfe meist hinter dem Button "Quick Info". In diesem Fall ist es die "shellapi.h&quot
    Günther

    Comment


    • #3
      Danke Günther, werde es gleich ausprobiere

      Comment


      • #4
        Toll. Super funktioniert. Nur jetzt habe ich das Problem, daß ich eine Access Violation in Modul ntdll ausgelöst habe, nachdem ich auf den TSpeedBtn das Ereignis ausgelöst habe, die Liste zu füllen. Entweder liegt das Problem bei WinNT 4.0 (Servicepack 5) mit den vielleicht strengen Zugriffsberechtigungen oder vielleicht paßt die Routine nicht auf ein Btn-Click Ereignis oder es liegt ein Bug C++ Builder 4.0 vor. Vielleicht kann mir jemand helfen.
        <br>
        <br>
        void __fastcall TForm1::SpeedButton3Click(TObject *Sender)<br>
        {<br>
        <br>
        <t>SHFILEINFO IconInfo;<br>
        <t>char path[MAX_PATH];<br>
        <t>TSearchRec SearchRecord;<br>
        <br>
        <t>//Binde die Imageliste an die System-Inmageliste<br>
        <t>ImageList1->ShareImages = true;<br>
        <t>ImageList1->Handle = SHGetFileInfo("",0,&IconInfo,<br>sizeof<t><t>(Icon Info),<br>
        <t>SHGFI_ICON | SHGFI_SMALLICON |SHGFI_SYSICONINDEX);<br>
        <t>ListView1->SmallImages = ImageList1;<br>
        <br>
        <t>//Screenupdating<br>
        <t>ListView1->Items->BeginUpdate();<br>
        <br>
        <t>//Erkenne die erste Datei im Desktop-Root<br>
        <t>if(FindFirst("C:\\Windows\\Desktop\\*.*", faAnyFile, <t><t>SearchRecord)<br> == 0);
        <t>{ //Füge ein neues Irem dazu und verbinde den gefundenen<br>
        <t>//Dateinamen mit seiner Überschrift<br>
        <t>TListItem *Item = ListView1->Items->Add();<br>
        <t>Item->Caption = SearchRecord.Name;<br>
        <br>
        <t>//Erhalte den Index der ImageList der zu dem Inhalt paßt.<br>
        <t>AnsiString Path = "C:\\Windows\\Desktop\\" + Item-<t>>Caption;<br>
        <t>strcpy(path, Path.c_str());<br>
        <t>SHGetFileInfo(path, 0, &IconInfo, sizeof(IconInfo),<br>
        <t><t>SHGFI_ICON |SHGFI_SHELLICONSIZE | <t><t>SHGFI_SYSICONINDEX);<br>
        <t>Item->ImageIndex = IconInfo.iIcon;<br>
        <br>
        <t>//Wiederhole nun diesen Prozeß bis ans Ende.<br>
        <t>while(FindNext(SearchRecord) == 0)<br>
        <t>{ Item = ListView1->Items->Add();<br>
        <t><t>Item->Caption = SearchRecord.Name;<br>
        <br>
        <t> Path = "C:\\Windows\Desktop\\" + Item->Caption;<br>
        <t>strcpy(path, Path.c_str());<br>
        <t>SHGetFileInfo(path,0, &IconInfo, sizeof(IconInfo),<br>
        <t><t>SHGFI_ICON | SHGFI_SHELLICONSIZE | <t><t>SHGFI_SYSICONINDEX);<br>
        <t> Item->ImageIndex = IconInfo.iIcon;<br>
        <t>}<br>
        <br>
        <t> //Schließe den Search Handle.<br>
        <t>FindClose(SearchRecord);<br>
        <br>
        <t>//Restore ScreenUpdate<br>
        <t>ListView1->Items->EndUpdate();<br>
        }<br>
        <br>
        }<br>
        <br>
        <br>
        Tut mir leid, wegen dem Format, vielleicht kann mir bei dieser Gelegenheit jemand sagen, wie ich das besser hinkriege. Danke.

        &#10

        Comment


        • #5
          <html>

          <head>
          <meta http-equiv="Content-Type"
          content="text/html; charset=iso-8859-1">
          <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
          <title>Normale Seite ohne Titel</title>
          </head>

          <body bgcolor="#FFFFFF">

          <p>Hallo Roman,</p>

          <p>In Deinem Quelltext steht hinter der Abfrage
          if(FindFirst(...)==0) e<font color="#000000">in Semikoleon.
          Danach folgt - ohne vorangehendes else - eine öffnende
          geschweifte Klammer, deren Gegenstück ich nicht ausfindig machen
          kann. WO ist das Ende ?</font> Dann folgt eine Auswertung der
          Daten und eine Schleife while(FindNext(...)) mit einer weiteren
          Auswertung. Das würde ich ändern in</p>

          <pre>
          if(FindFirst(...) == 0)
          do
          {
          TListItem * Item=...
          //und weitere Auswertung
          }
          while(FindNext(...)==0)
          </pre>

          <p>Wenns danach noch nicht läuft, bitte ein erneutes Listing !
          (Du möchtest ja üben ;-)</p>

          <p>Zur Formatierung: Vor den Quelltext ein<strong> </strong><font
          color="#FF0000"><strong>&lt; pre &gt;</strong></font> und
          hinterher ein <font color="#FF0000"><strong>&lt; /pre &gt;</strong></font>
          ohne die Leerzeichen. Ich selbst mach mir die Mühe und schreib
          den Text mit Frontpage Express, füg die beiden HTML-Tags in der
          HTML Ansicht ein, entferne alle dazwischenliegenden HTML-Tags und
          korrigier die Zeileneinrückungen. Vermutlich geht es aber auch
          einfacher. Dann geh ich wieder zurück in den Frontpage-Editor,
          mach alles noch ein wenig <font color="#FF0000">bunter</font>
          oder <strong>fetter</strong>, und geh dann wieder in die
          HTML-Ansicht. Dort kopiere ich alles in die Zwischenablage, und
          danach in den Forum-Editor.</p>

          <p>&nbsp;</p>

          <p>&nbsp;</p>
          </body>
          </html&gt
          Günther

          Comment


          • #6
            Ich freue mich das du mir geholfen hast. Danke an dieser Stelle. Die Fehlermeldung bleibt jetzt aus, nur füllt sich die TListView nicht mit Icons und Daten. Irgendwas muß noch falsch sein

            Comment


            • #7
              Hallo Roman, wird die Schleife denn korrekt durchlaufen ? Überprüf das mit dem Debugger, oder setz eine MessageBox da rein. In der Zeile Path = "C:\\Windows\Desktop\\" + Item->Caption; fehlt übrigens zwischen Windows und Desktop der zweite Backslash, das könnte auch eine Ursache sein ! Gruß - Günthe
              Günther

              Comment


              • #8
                Eh klar, wieso es nicht funktioniert hat: Der Pfad war falsch. In WinNT gibt es kein C:\Windows\Desktop sondern C:\WINNT\Profiles\Administrator\Desktop!

                Die Daten werden jetzt zwar angezeigt, nur mit einem kleinen Schönheitsfehler

                1. Es steht überall die Endung .lnk für Link
                2. Die Icons fehlen ganz
                3. Es werden die ersten 2 Leerverzeichnisse ebenfalls angezeigt (mit "." bzw. ".." wie unter MS-DOS

                Aber ich finde es spitze daß ich es schon so weit gebracht habe durch deine Hilfe Günther. Vielleicht gibt es noch eine Möglichkeit diesen Schönheitsfehler ebenfalls auszubügeln. Danke nochmals

                Comment


                • #9
                  Ich glaub ich habs.

                  SHGetFileInfo ist nicht definiert. Wer weiß zu welcher Header-Datei diese Funktion gehört

                  Comment


                  • #10
                    Hallo Roman, wir hatten heute Internetausfall, deshalb antworte ich jetzt mit ein paar Stunden Verspätung :-(

                    Deine Frage in #8 verstehe ich jetzt nicht. Die hattest Du doch schon am Anfang gestellt, und ich hatte sie in #1 beantwortet.

                    Und zu #7: Klar, daß im Desktop-Verzeichnis meistens .lnk Dateien stehen. Und die Icons mußt Du Dir selbst zur Anzeige bringen. Frag mich jetzt nicht, wie ! Die Verzeichnisnamen mußt Du entsprechend auswerten, wenn Du . und .. überspringen möchtest. Entweder SearchRecord.Name[0] auf . überprüfen, oder einen genauen Stringvergleich machen..
                    Günther

                    Comment


                    • #11
                      Sobald ich das Problem gelöst habe werde ich mich wieder melden. Und dann aber mit einem stilistisch schönem Codebeispiel. Danke nochmals für die Hilf

                      Comment

                      Working...
                      X