Desktop-Pfad herausfinden
-
Incocnito schrieb:
...
FYI: env ist eine Erweiterung des MSVC und ist kein "generelles C++" und damit auch nicht "auf C++ Art und Weise".
Verwendet doch bitte einfach die von Microsoft vorgesehene Variante die in meinem Link beschrieben ist, danke.
MfG SideWinder
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Killur schrieb:
Die Version von Incognito geht perfekt, nur ist mir gerade aufgefallen das ich keine Datei auf c: erstellen kann.
Schau mal unter Rechtsklick laufwerk c: -> Sicherheit, ob du schreibrechte hast.
Kommt keine Fehlermeldung ? / Fängst du die Fehler ab ?Gruss Sheldor
-
Das muss mal eben einfach sein:
#include <iostream> #include <fstream> #include <windows.h> using namespace std; string get_username() { char acUserName[100]; DWORD nUserName = sizeof(acUserName); GetUserName(acUserName, &nUserName); string USERNAME(acUserName); return USERNAME; } int os() { OSVERSIONINFO osver; osver.dwOSVersionInfoSize = sizeof(osver); GetVersionEx(&osver); if(osver.dwMajorVersion == 5) return 1; //XP if(osver.dwMajorVersion == 6) if(osver.dwMinorVersion == 0) return 2; //vista if(osver.dwMinorVersion == 1) return 3; //windows 7 return 0; } int main() { fstream datei; string pfad; switch(os()) { case 1: pfad = "C:/Dokumente und Einstellungen/"; break; case 2: case 3: pfad = "C:/users/"; break; } pfad += get_username(); //die funktion benutzen pfad += "/desktop/datei.txt"; datei.open(pfad.c_str(), ios::out); datei << "hi!"; }
-
Incocnito schrieb:
Das muss mal eben einfach sein:
Was? Unfug zu produzieren?
1. Der Namen den GetUserName liefert und das Unterverzeichnis für den C:\Users Folder müssen nicht übereinstimmen. (Beispiel: 1. lokaler Benutzer Martinmeldet sich an, 2. Domänen Benutzer Martin meldet sich an.)
2. Und wenn Windows 8 kommt geht es nicht mehr weil C:\Users wieder was anderes wird.
3. Kann man das C:\Users Verzeichnis auf eine andere Platte verlegen.SideWinder hat bereits auf die Lösung mit SHGetSpecialFolderPath hingewiesen.
Das ist IMHO der einzig richtige Weg.
http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx
-
Incocnito schrieb:
Das muss mal eben einfach sein:
#include <iostream> #include <fstream> #include <windows.h> using namespace std; string get_username() { char acUserName[100]; DWORD nUserName = sizeof(acUserName); GetUserName(acUserName, &nUserName); string USERNAME(acUserName); return USERNAME; } int os() { OSVERSIONINFO osver; osver.dwOSVersionInfoSize = sizeof(osver); GetVersionEx(&osver); if(osver.dwMajorVersion == 5) return 1; //XP if(osver.dwMajorVersion == 6) if(osver.dwMinorVersion == 0) return 2; //vista if(osver.dwMinorVersion == 1) return 3; //windows 7 return 0; } int main() { fstream datei; string pfad; switch(os()) { case 1: pfad = "C:/Dokumente und Einstellungen/"; break; case 2: case 3: pfad = "C:/users/"; break; } pfad += get_username(); //die funktion benutzen pfad += "/desktop/datei.txt"; datei.open(pfad.c_str(), ios::out); datei << "hi!"; }
Wenn ich mir im Gegenzug die Lösung von der verlinkten Seite von SideWinder anschaue:
// String buffer for holding the path. TCHAR strPath[ MAX_PATH ]; // Get the special folder path. SHGetSpecialFolderPath( 0, // Hwnd strPath, // String buffer. CSIDL_DESKTOPDIRECTORY, // CSLID of folder FALSE ); // Create if doesn't exists?
finde ich diese besser^^. Vorteil ist, dass ich bei zukünftigen Win Versionen mein Programm wahrscheinlich nicht anpassen muss und es auch kürzer ist.
-
So geht's für Versionen auch vor XP / 2000:
#include <windows.h> #include <shlobj.h> #include <iostream> using namespace std; int main() { LPITEMIDLIST pIdList; char path[MAX_PATH]; SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pIdList); SHGetPathFromIDList(pIdList, path); cout << "Pfad:\n" << path << endl; }
-
Ich wusste schon, dass das Quatsch ist. Viel zu groß und klobig. Aber es musste einfach sein
-
Belli schrieb:
So geht's für Versionen auch vor XP / 2000:
... LPITEMIDLIST pIdList; char path[MAX_PATH] SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pIdList); SHGetPathFromIDList(pIdList, path); ... }
Die Freigabe fehlt noch. Also entweder eine eigene kleine RAII-Klasse schreiben (die bessere Lösung) oder zumindest
LPMALLOC Malloc; SHGetMalloc(&Malloc); if(Malloc) { Malloc->Free(pIdList); Malloc->Release(); }
-
Danke euch allen, es geht jetzt