Zum Inhalt springen

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


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

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

Geschrieben
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

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...