Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Auslesen von Systemvairablen - getenv() verkürzt Pfade :(

Empfohlene Antworten

Veröffentlicht

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

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

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.

Vielen Dank für die Tipps!

Allerdings meckert er bei GetLongPathName ebenfalls:

'GetLongPathName' : nichtdeklarierter Bezeichner :confused:

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

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 moeglich

Dann 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]

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

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

Es funktioniert!

Besten Dank für die Mühe! :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.