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.
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:
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\\Personalsteht, 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 HRESULTDas 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...