getenv() will nicht so recht
-
Oje, Da Du Deinen letzten Beitrag komplett neu editiert hast, paßt meine letzte Antwort natürlich nicht mehr dazu.
Bitte nutze deshalb die Editierfunktion hier im Forum nur für kleinere Korrekturen, sonst kann der rote Faden für uns (und auch für andere Leser!) total verloren gehen.
Nun zum Thema:
Wie ich schon weiter oben empfohlen habe: Reduzier bitte Dein Programm auf nur noch die setenv() und getenv() Funktionen. Dazu natürlich zwischendurch die hilfreichen Kontrollausgaben in die Konsole.Martin
-
So, guten morgen. Habs mal jetzt in nen neues projekt gepackt, das nun nurnoch aus den Zeilen besteht:
#define _WIN32_WINNT 0x0501 #include <conio.h> #include <stdio.h> #include <tchar.h> #include <iostream> #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { std::cout << ::SetEnvironmentVariable("GENICAM_ROOT", "C:\\GenICamSDK") << std::endl; //::std::cout << getenv("GENICAM_ROOT") << std::endl; getch(); return 0; }
Die "SetEnvironment..." Zeile liefert schon ne 1 zurück ... und per "set" inner console wurde die Variable auch nicht gesetzt. Dementsprechend scheint es echt der fall zu sein, dass getenv auf eine variable zugreifen will, die es nicht gibt. Die frage ist nun, warum kann die variable nicht geschrieben werden?
-
#define _WIN32_WINNT 0x0501 #include <conio.h> #include <stdio.h> #include <tchar.h> #include <iostream> #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { char name[2000]; std::cout << ::SetEnvironmentVariable("GENICAM_ROOT", "C:\\GenICamSDK") << std::endl; std::cout << ::GetEnvironmentVariable("GENICAM_ROOT", name, 2000) << " " << name << std::endl; //std::cout << getenv("GENICAM_ROOT") << std::endl; getch(); return 0; }
1 13 C:\GenICamSDK
"GetEnvironmentVariable" funktioniert... aber warum nicht getenv? Ich weiß nicht, in wie fern die restlichen bibliotheken diese funktion verwenden, weshalb ich lieber auf getenv zurückgreifen möchte.
-
Jetzt verwendest Du die Funktion SetEnvironmentVariable() statt bisher setenv().
Dazu eine kleine Anmerkung (gilt für alle Bereiche der Programmierung):
Verwende nach Möglichkeit immer den jeweils zusammengehörenden Gegenpart, alsoSetEnvironmentVariable() und GetEnvironmentVariable() //das sind Windows-Funktionen
ODER
setenv() und getenv() //das sind CRT-Funktionen
Ansonsten sind unerklärliche Fehlerbilder (oder zumindestens versteckte "Zeitbomben") Deine ständigen Begleiter
Also bitte nicht SetEnvironmentVariable() mit getenv() mischen!
Martin
-
achso, ok, weil im Urprogramm wird es ja so gemacht ... das setenv is ja nur eine funktion im hauptprogramm, und kommt in den bibliotheken garnicht vor...
-
Ohhhh, ist mir gar nicht aufgefallen, daß setenv() nicht "Standard" unter Windows ist
Zumindestens unter Linux gibts aber in stdlib.h die Deklaration von setenv().
Unter Windows hättest Du wahrscheinlich stattdessen _putenv() nehmen sollen (habs eben gegoogelt, deshalb keine Gewähr auf korrekte Funktion).
Unabhängig davon:
Ich persönlich finde die Windows-Funktionen SetEnvironmentVariable() und GetEnvironmentVariable() besser.Freut mich, Dir konnte geholfen werden
Martin
-
Jau cool, funzt
#define _WIN32_WINNT 0x0501 #include <conio.h> #include <stdio.h> #include <tchar.h> #include <iostream> #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { char name[2000]; ::putenv("GENICAM_ROOT=C:\\GenICamSDK"); std::cout << getenv("GENICAM_ROOT") << std::endl; getch(); return 0; }
Nu weiß ich, was MS in seiner Doku mit "...These functions are deprecated because more secure versions are available..." zu getenv() meint
Ich danke dir recht herzlich
-
Noch einmal kurz eine sache die mich irritiert - der compiler warnt mich wie folgt:
Warnung 2 Folgende Umgebungsvariablen konnten nicht gefunden werden: $(GENICAM_ROOT) $(GENICAM_MINOR) $(GENICAM_MAJOR) Projekt
aber mindestens GENICAM_ROOT ist doch jetzt gesetzt?
-
Aber doch nicht beim Compilieren, oder?
Sondern erst wenn Dein Programm schon compiliert ist und ausgeführt wurde... und dann auch nur innerhalb Deines Prozesses...Umgebungsvariablen setzrt man in der Systemsteuerung unter "System|Erweitert|Umgebungsvariablen".
-
Kommt als warnung inner Compiler log, ist jetzt aber verschwunden nachdem ich sie per hand eingegeben hab. Danke!