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
Klotzkopp Geschrieben 22. November 2004 Geschrieben 22. November 2004 GetFullPathName kann aus der 8.3-Schreibweise die lange machen.
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
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.
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:
Klotzkopp Geschrieben 23. November 2004 Geschrieben 23. November 2004 #include <windows.h> hast du aber, oder? Hast du ein aktuelles Platform SDK drauf?
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
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]
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
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.
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
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.
backdraft Geschrieben 23. November 2004 Autor Geschrieben 23. November 2004 Es funktioniert! Besten Dank für die Mühe!
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden