Allgemeiner Zugriff auf Standardfolder......



  • xenayoo schrieb:

    Zudem wird bei MSDN erklärt, dass dies eine veraltete Funktion sei, die bei neueren Windowsversionen nicht mehr unterstützt wird. Man solle doch statt dessen GetFolderPath() verwenden

    Komisch, den Hinweis hab ich gar nicht gesehen. Stattdessen bin ich (über Umwege) bei SHGetKnownFolderPath gelandet.



  • TyRoXx schrieb:

    xenayoo schrieb:

    Wie bekomme ich in c++ (nicht VC++) den Pfad zu den eigenen Dateien

    Gar nicht.

    xenayoo schrieb:

    und zwar unabhängig von user

    Das ergibt keinen Sinn. Jeder Benutzer hat eigene Eigene Dateien.

    xenayoo schrieb:

    und eingestellter Sprache?

    Was hat das damit zu tun?

    Man kann sich echt auch bewusst dumm stellen... 🙄
    Das er "Eigene Dateien" vom aktuell eingeloggten Benutzer haben will, kann man eigentlich schon aus der Frage erkennen. Und das mit der "eigestellten Sprache" (englisches System <-> deutsches System -> "My Documents" <-> "Eigene Dateien") gemeint ist, kann man auch verstehen.
    Leider ist das unter Windows ziemlich vermurkst. Ich habe auch nichts besseres als das, was Basher vorschlägt, gefunden.



  • Hallo TyRoXx,

    das Programm soll den Pfad zu 'My Documents' emitteln - und zwar Rechnerunabhängig. 'Gar nicht' ist eine sehr hilfreiche Aussage, die wohl so nicht stimmt.

    @Bashar:

    vielleicht hätte ich dazu schreiben sollen: Es handelt sich um Windows XP. Bei SHGetKnownFolderPath steht Vista als Minimum Requirement dabei. Außerdem hab ich keine FolderID für die eigenen Dateien gefunden.

    Jens



  • xenayoo schrieb:

    das Programm soll den Pfad zu 'My Documents' emitteln - und zwar Rechnerunabhängig. 'Gar nicht' ist eine sehr hilfreiche Aussage, die wohl so nicht stimmt.

    Doch sie stimmt. Mit reinem C++ kannst du diese Information nicht bekommen. Hierfür muss eine OS spezifische API verwendet werden.



  • xenayoo schrieb:

    @Bashar:

    vielleicht hätte ich dazu schreiben sollen: Es handelt sich um Windows XP. Bei SHGetKnownFolderPath steht Vista als Minimum Requirement dabei. Außerdem hab ich keine FolderID für die eigenen Dateien gefunden.

    Dann halt SHGetFolderPath

    Als CSIDL nimmst du CSIDL_MYDOCUMENTS.



  • Guckst du:
    SHGetFolderPath()
    Accessing-All-of-Windows-Special-Folders#TableCSIDL

    #include <iostream>
    
    #include <Shlobj.h>
    
    int main()
    {
    	char path[ MAX_PATH ];
    	SHGetFolderPathA( nullptr, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, nullptr, 0, path );
    	std::cout << path << std::endl;
    }
    

    // edit: too late.



  • Bashar schrieb:

    Dann halt SHGetFolderPath

    Als CSIDL nimmst du CSIDL_MYDOCUMENTS.

    Hallo Bashar,

    mit SHGetFolderPath habe ich es bereits versucht:

    char szBuffer[MAX_PATH];
    if(SHGetFolderPath( HWND_DESKTOP, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, szBuffer);
    {
        MessageBox(...);
    }
    else
    {
        MessageBox(...);
    }
    

    Das lässt sich fehlerfrei kompilieren. Allerdings Bekomme ich immer nur die Messagebox aus else gezeigt. Laut MSDN-Homepage wirft die Funktion bei virtuellen Ordnern einen Fehler aus. BTW: auch CSIDL_MYDOCUMENTS gibt es erst ab Vista - davor hieß es CSIDL_PERSONAL.

    Jens



  • Was vielleicht noch gehen könnte, ist ein Zugriff auf die Registry:

    class user_reg_value
    {
    public:
        user_reg_value(std::string const & key)
        {
            LONG r = RegOpenKeyA(HKEY_CURRENT_USER, key.c_str(), &m_key);
            if(ERROR_SUCCESS != r)
            {
                throw std::runtime_error("bad thing");
            } 
        }
    
        ~user_reg_value()
        {
            RegCloseKey(m_key);
        }
    
        std::string query(std::string const & value_name)
        {
            DWORD size = 0;
            LONG r = RegQueryValueExA(m_key, value_name.c_str(), 0, 0, 0, &size);
            if(ERROR_SUCCESS != r)
            {
                throw std::runtime_error("bad thing");
            }
            std::vector<BYTE> buff(size);
            r = RegQueryValueExA(m_key, value_name.c_str(), 0, 0, &buff.front(), &size);
            if(ERROR_SUCCESS != r)
            {
                throw std::runtime_error("bad thing");
            }
            return std::string(buff.begin(), buff.end());
        }
    
    private:
        HKEY m_key;
    };
    
    int main()
    {
        user_reg_value val("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders");
        std::cout << val.query("Personal"); 
    }
    

    In Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Personal steht, auf den von mir geprüften Systemen, immer der richtige Pfad. Wenn jemand noch 'ne bessere Methode kennt, die Länge das auszulesenden Wertes zu ermitteln, dann her damit.



  • Hallo,

    Asche auf mein Haupt. Die Funktion arbeitet einwandfrei. Ich habe nur etwas gebraucht, biss ich die Rückgabewerte der Funktion verstanden habe:
    Rückgabetyp HRESULT

    Das bedeutet, wenn die Funktion S_OK liefert ist HRESULT == 0, d.h. false. Logisch, dass dann immer der ese-Teil meines Codes ausgefüht wird.

    Lösung:

    HRESULT HRwert = SHGetFolderPath( HWND_DESKTOP, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, szBuffer);
    if(HRwert == 0)
    {.....}
    

    Danke an alle.

    Jens

    Frage: Kennt jemand vielleicht einen Artikel mit den verschiedenen Zeichenketten und strings (cons char *name; Cstring; LPSTRING; c++ stringklasse; etc) und wie man mit ihnen umgeht sowie umwandlung?



  • edit: hab mich vertan - sollte ein neuer Thread werden...


Anmelden zum Antworten