wie bekommt man SHGetSpecialFolderPath zum laufen ?



  • Hallo,

    kann mir jemand einen Link oder ein kleines Beispiel

    zu SHGetSpecialFolderPath zeigen ?

    Bei mir will der Compiler nicht, liegt warsch. an mir ... 🙂

    Gruß



  • Mit einer Fehlerbeschreibung wie "Bei mir will der Compiler nicht, liegt warsch. an mir" kann hier niemand was anfangen! Bitte poste deine genaue Fehlermeldung damit dir jemand helfen kann ...

    Gruß Skay



  • Hi,

    sorry, hier die Fehlermeldung:

    Bezeichner "Foldersettings merfach deklariert" allerdings deutet dieser auf die Datei shobjidl.h hin...

    mein Code:

    #include "shlobj.h"
    
    char szFolder[255];
    SHGetSpecialFolderPath(0, szFolder, CSIDL_COMMON_STARTUP,   false);
    

    Gruß



  • Hi all ,

    mein Schulkamerad hat den "Fehler" nach einer Stunde intensiv-suche gefunden...

    also insgesamt waren 2 Fehler vorhanden , zum erstem ist in dieser Zeile:

    SHGetSpecialFolderPath(0, szFolder, CSIDL_COMMON_STARTUP,   false);
    

    das CSLIDL_COMMON_STARTUP nicht definiert das heißt hier langt erstmal eine Zahl zwischen 0 und 59 , je nachdem was man auslesen möchte.

    Zum zweitem Fehler habe ich keine Erklärung aber was fehlt ist diese Zeile:

    #define NO_WIN32_LEAN_AND_MEAN
    

    Weiß vielleicht jemand warum diese Zeile dort unbedingt nötig ist , bzw. was sie eigentlich bewirken soll ???

    Gruß



  • Hallo,

    Skatepirat schrieb:

    Weiß vielleicht jemand warum diese Zeile dort unbedingt nötig ist , bzw. was sie eigentlich bewirken soll ???

    siehe dazu:

    http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_faster_builds_and_smaller_header_files.asp

    das Makro NO_WIN32_LEAN_AND_MEAN ist allerdings wohl eine Besonderheit der Borland-Umgebung, deshalb findest du dazu nichts in der MSDN, aber die Bedeutung ist offensichtlich das Gegenteil der Wirkungsweise, wenn WIN32_LEAN_AND_MEAN definiert wurde.

    Und Zahlen anstatt der Konstanten(CSIDL_COMMON_STARTUP) verwendet man erst recht nicht, nur um Fehler zu beseitigen, stattdessen sollten die richtigen und alle nötigen Header includiert werden, damit man eben mit Konstanten arbeiten kann.

    MfG



  • Hallo,

    .. und welche HeaderDatei wäre Deiner Meinung nach die richtige ??
    natürlich sind sprechende Konstanten schöner ...
    sobald ich die shlobj.h einbinde, gibt es nur noch Fehler ...

    Gruß



  • Wie alt ist Dein PSDK?



  • .. eigentlich gar nicht alt ... vielleicht 2 monate oder so ?



  • Skatepirat schrieb:

    mein Code:

    #include "shlobj.h"
    
    char szFolder[255];
    SHGetSpecialFolderPath(0, szFolder, CSIDL_COMMON_STARTUP,   false);
    

    Das ist doch sicherlich nicht dein ganzer Code, der mit SHGetSpecialFolderPath zusammenhängt, oder?

    Zeig doch mal mindestens 10 Zeilen vorher und 10 Zeilen danach mit an...

    Laut MSDN soll man stattdessen seit Windows2000 lieber SHGetFolderPath nehmen, allerdings scheint das kein CSIDL_COMMON_STARTUP zu kennen/mögen.

    Das aktuelle PSDK ist vom Februar 2003... DAS meinte ich mit "wie alt". Ich wollte lediglich wissen ob Du die aktuellste Version hast...



  • also wirklich viel mehr Code habe ich auch nicht , es hatte mich erstmal nur prinzipiel interessiert wie man diese Verzeichnisse ausliest , da ich an einem Backupprogram arbeite.

    Hier ist der Code, der mit einige (nicht alle,aber das langt erstmal) Sonderverzeichnisse anzeigt.

    #define NO_WIN32_LEAN_AND_MEAN
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        char szFolder[MAX_PATH];
        for (int temp=0;temp<=59;temp++)
        {
            SHGetSpecialFolderPath(0, szFolder, temp, false);
            RichEdit1->Lines->Add(AnsiString(temp) + "      " + AnsiString(szFolder));
        }
        // 0 -> USER\Desktop
        // 2 -> USER\Startmenü\Programme
        // 5 -> USER\Eigene Dateien
        // 6 -> USER\Favoriten
        // 7 -> USER\Startmenü\Programme\Autostart
        // 8 -> USER\Recent
        // 9 -> USER\SendTo
        // 11-> USER\Startmenü
        // 13-> USER\Eigene Dateien\Eigene Musik
        // 16-> siehe 0
        // 19-> USER\Netzwerkumgebung
        // 20-> \Windows\Fonts
        // 21-> USER\Vorlagen
        // 22-> All Users\Startmenü
        // 23-> All Users\Startmenü\Programme
        // 24-> All Users\Startmenü\Programme\Autostart
        // 25-> All Users\Desktop
        // 26-> USER\Anwendungsdaten
        // 27-> USER\Druckumgebung
        // 28-> USER\Lokale Einstellungen\Anwendungsdaten
        // 31-> All Users\Favoriten
        // 32-> USER\Lokale Einstellungen\Temporary Internet Files
        // 33-> USER\Cookies
        // 34-> USER\Lokale Einstellungen\Verlauf
        // 35-> All Users\Anwendungsdaten
        // 36-> \WINDOWS
        // 37-> \WINDOWS\System32
        // 38-> \Programme
        // 39-> USER\Eigene Dateien\Eigene Bilder
        // 40-> USER
        // 41-> \WINDOWS\System32
        // 43-> \Programme\Gemeinsame Dateien
        // 45-> All Users\Vorlagen
        // 46-> All Users\Dokumente
        // 47-> All Users\Startmenü\Programme\Verwaltung
        // 53-> All Users\Dokumente\Eigene Musik
        // 54-> All Users\Dokumente\Eigene Bilder
        // 56-> \WINDOWS\resources
        // 59-> USER\Lokale Einstellungen\Anwendungsdaten\Microsoft\CD Burning
    
    }
    

    wie man erkennen kann, braucht man für diesen Befehl wirklich nicht mehr ...

    ..so wie es aussieht ist es dann die aktuelle PSDK - Version. Ich wollte nur einen einfachen Befehl für die Sonderverzeichnisse.. kann mir nicht vorstellen dass dieser abgelöst werden soll , denn viel einfacher gehts doch gar nicht mehr .. ich kenne eine andere Variante, die sieht so aus:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        LPITEMIDLIST  pidl ;
        LPMALLOC      pShellMalloc;
        char          szDir[MAX_PATH];
    
        // SHGetSpecialFolderLocation generates a PIDL. The memory for the PIDL
        // is allocated by the shell, and should be freed using the shell
        // mallocator COM object. Use SHGetMalloc to retrieve the malloc object
        if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
        {
            // if we were able to get the shell malloc object, then
            // proceed by fetching the pidl for the windows desktop
    	if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,
    						CSIDL_PERSONAL,
                                                    &pidl)))
            {
                // return is true if success
                if(SHGetPathFromIDList(pidl, szDir))
                {
                    // set one caption to the directory path
                    Label1->Caption = szDir;
                }
    
                pShellMalloc->Free(pidl);
            }
    
            pShellMalloc->Release();
        }	
    }
    

    auch hier braucht man die:

    #define NO_WIN32_LEAN_AND_MEAN
    

    Zeile. Aber dieses Problem haben wir nun gefunden.
    Allerdings akzeptiert diese Methode nun die Konstanten.
    ( include - Zeilen sind mit den oberen identisch )

    Gruß



  • Skatepirat schrieb:

    auch hier braucht man die:

    #define NO_WIN32_LEAN_AND_MEAN
    

    Zeile. Aber dieses Problem haben wir nun gefunden.
    Allerdings akzeptiert diese Methode nun die Konstanten.
    ( include - Zeilen sind mit den oberen identisch )

    Gruß

    Dazu hab ich das hier per Google gefunden.

    Läuft's denn nun?



  • Danke, diese Seite kenne ich bereits 🙂

    Das was ich gepostet habe läuft.

    Gruß


Anmelden zum Antworten