backdraft Geschrieben 22. November 2004 Geschrieben 22. November 2004 Hi! Ich suche nach einer Möglichkeit Systemvariablen (z.B. %TEMP%) auszulesen. Das funktioniert ja mit der getenv("TEMP") Methode. Allerdings gibt die Methode den Pfad nach 8.3 Notation verkürzt zurück. Also: C:\DOKUME~1\..... Ich benutze den Pfad aber als Parameter zum Aufrufen eines anderen Programs (pdflatex). Dieses könnte mit Leerzeichen und Anführungszeichen ("C:\Dokumente und Einstellungen\..." umgehen, allerdings meldet es bei der oben genannten Verkürzung "undefined control sequence" bei ~. Wer hat eine Idee, wie man an den kompletten Pfad der Systemvariablen dran kommt? Gruß backdraft Zitieren
Klotzkopp Geschrieben 22. November 2004 Geschrieben 22. November 2004 GetFullPathName kann aus der 8.3-Schreibweise die lange machen. Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Hm... wenn ich die Methode verwende, meckert er: 'GetFullPathName' : nichtdeklarierter Bezeichner Woran kann das liegen? Eigentlich muss man doch keine zusätzliche Header-Datei einbinden, oder? Der Aufruf sieht so aus: string path = "C:\DOKUME~1\user\LOKALE~1\Temp\file.dat"; char* pathBuffer = new char[255]; char* Adress = new char[255]; GetFullPathName(path,sizeof(path),pathBuffer,&Adress); [/PHP] Gruß backdraft Zitieren
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 Mein Fehler: Es ist GetLongPathName, nicht GetFullPathName: const char* path = "C:\\DOKUME~1\\user\\LOKALE~1\\"; char pathBuffer[MAX_PATH+1]; DWORD dwRet = GetLongPathName(path, pathBuffer, MAX_PATH); [/CODE] Aber noch ein paar Tipps zu deinem Code: 1. In Literalen im Quellcode musst du immer doppelte Backslashes machen. 2. Mal abgesehen davon, dass du die Größe des Puffers, nicht die Länge des umzuwandelnden Pfades angeben müsstest: sizeof(path) ist 4 (auf 32Bit-Windows), falls path ist ein char* ist. Ist path eine Instanz einer Stringklasse, wird dabei auch nicht die Länge herauskommen. Mit sizeof kannst du nicht die Größe eines dynamisch allokierten Speicherbereichs bestimmen. Das geht überhaupt nicht in C++. 3. Der vierte Parameter von GetFullPathName (char**) ist ein "out"-Parameter, d.h. der Zeiger wird auf einen neuen Wert gesetzt. Damit ist der Speicher, den du für Adress mit new angefordert hast, verloren. Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Vielen Dank für die Tipps! Allerdings meckert er bei GetLongPathName ebenfalls: 'GetLongPathName' : nichtdeklarierter Bezeichner :confused: Zitieren
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 #include <windows.h> hast du aber, oder? Hast du ein aktuelles Platform SDK drauf? Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Ja, hab ich jetzt. Da meckert er dann aber wiederum über zig Fehler in der Datei rpcndr.h.... C:\Programme\VC98\INCLUDE\rpcndr.h(173) : error C2632: 'char' gefolgt von 'int' ist unzulaessig Und beim Aufruf von GetLongFileName() gibts den Fehler: error C2664: 'GetLongPathNameW' : Konvertierung des Parameters 1 von 'const char *' in 'const unsigned short *' nicht moeglich Zur Info: Ist n relativ umfangreiches Projekt mit VC++ 6 und Qt 3.1.2... und ich versteh hier immer weniger... Gruß backdraft Zitieren
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 Ja, hab ich jetzt. windows.h oder Platform SDK? Und beim Aufruf von GetLongFileName() gibts den Fehler: error C2664: 'GetLongPathNameW' : Konvertierung des Parameters 1 von 'const char *' in 'const unsigned short *' nicht moeglichDann hast du wohl UNICODE/_UNICODE definiert. const WCHAR* path = L"C:\\DOKUME~1\\user\\LOKALE~1\\"; WCHAR pathBuffer[MAX_PATH+1]; DWORD dwRet = GetLongPathName(path, pathBuffer, MAX_PATH); [/CODE] Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 windows.h oder Platform SDK? windows.h Bei dem Aufruf meckert er nicht mehr. Zeigt -nur- noch die 21 Fehler in C:\Programme\VC98\INCLUDE\rpcndr.h an (seit dem Einbinden von Windows.h) Gruß backdraft Zitieren
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 Du könntest versuchen, über die Reihenfolge der include-Direktiven etwas zu erreichen. Wenn das nicht hilft, dann pack die Funktion, die GetLongPathName benutzt, in eine eigene .cpp-Datei, die nur die wirklich benötigten Header benutzt. Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Hab die Reihenfolge der Includes geändert und <windows.h> ganz nach oben geschoben. Hat nichts gebracht. Dann hab ich ne eigene cpp/h datei mit mit ner Methode gemacht, die GetLongPathName verwendet. Wenn ich meine eigene Header-Datei einbinde um meine Methode zu verwenden, hab ich natürlich wieder das selbe Problem, als wenn ich die windows.h direkt einbinde.... Gruß backdraft Zitieren
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 Die #include-Direktive für <windows.h> darf nicht in der Headerdatei stehen. Alternativ könntest du auch auf eine Headerdatei komplett verzichten, und dort, wo du sie brauchst, eine Deklaration deiner Funktion einfügen. Zitieren
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Es funktioniert! Besten Dank für die Mühe! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.