Umgebungsvariable richtig neu setzen
-
Hallo,
wie kann ich eine Umgebungsvariable richtig anlegen. Damit meine ich jetzt nicht nur so dass sie während der Laufzeit gesetzt ist, sondern mehr oder weniger dann immer gesetzt ist auch wenn das Prog nicht läuft. Ich hoffe ihr wißt was ich meine.
Gruß Marcel
-
Du kannst ja einen kleinen Trick anwenden:
1. Öffne die Datei autoexec.bat
2. Schreibe als letzte Zeile "set [var]=[value]"
3. Starte den Rechner neu
-
Soll diese Umgebungsvariable aus einem Programm gesetzt werden, oder willst du sie einmal von Hand eintragen. Falls letzteres ist es eine Frage des Betriebssystems.
-
Hallo,
ich würde die Umgebungsvariable da ändern, wo sie auch vom Betriebssystem abgelegt wird, nämlich in der Registry unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
-
Also folgendes, ich soll ein Programm schreiben, welches prüft warum ein anderes Programm nachdem es installiert ist nicht richtig läuft.
Dazu will ich die mir bekannten Umgebungsvariablen prüfen, ob diese gesetzt sind oder nicht. Sollte das Programm dann feststellen, dass aus was auch immer für einen Grund, eine Variable nicht gesetzt ist, so will ich diese dann mittels Programm setzen. Diese Variable soll dann aber nicht nur zur Laufzeit gesetzt sein, sondern permanent.
Jemand ne Idee ???
Selbiges muß ich auch für DLL's machen, da habe ich aber noch nicht mal Ahnung wie ich die richtig prüfe ob die auch gesetzt sind ????Wäre schön wenn ihr mir helfen könntet.
Danke
-
wenn Du eine Umgebungsvariable in den o.g. Pfad der Registry einträgst, dann ist dieser Eintrag mit Sicherheit permanent.
Du könntest z.B. mit der Funktion RegEnumValue alle Einträge in diesem Pfad scannen um Deinen Vergleich durchzuführen. Zuvor muß Du noch mit RegOpenKeyEx Dir den Handle zu diesem Pfad holen. Beispielcode findest Du genügend im Archiv.
-
Ich bekomm das irgendwie nicht hin ?!?!?!
Könnte mir vielleicht mal jemand den Code dafür posten, wie ich in einem Programm beispielsweile die Umgebungsvariable PATH auch mit auf C:\Test zeigen lassen kann. Irgendwie ist das ganze wohl zu warm für mich.
Bitte wäre eine echt große Hilfe.
Danke
-
Hallo Tantor,
tut mir leid, wenn ich jetzt erst antworte, aber ich bin die ganze Woche nicht dazu gekommen ins Forum hineinzuschauen. Ich hab Dir mal einen Ausschnitt aus einem Code gepostet, den ich selbst für ein Setup-Programm benutze, um den Standard Path zu erweitern. Ich denke das es das ist, was Du suchst.
Die entscheidene Funktion heißt AddPath.
/*****************************************************************/ LPVOID WINAPI AllocPtr (DWORD Size) { LPVOID ret; ret = malloc(Size); if (ret) memset(ret, 0, Size); return (ret); } /*****************************************************************/ VOID WINAPI Free_Ptr (LPVOID Ptr) { LPPVOID PPV; PPV = (LPPVOID) Ptr; Ptr = NULL; if (PPV) { Ptr = *PPV; *PPV = NULL; } if (Ptr eq NULL) return; free (Ptr); } /*-------------------------------------------------------------------------*/ HANDLE WINAPI OpenRegKey (HANDLE hKey, LPSTR Path, WORD New) { HANDLE ret; DWORD dw; WORD n; LONG hl,Acc; ret = 0; //SetLastError(0); if (New) { Acc = KEY_ALL_ACCESS; RegCreateKeyEx (hKey, Path, 0, "", 0, Acc, NULL, &ret, &dw); }else{ // Acc = KEY_READ; Acc = KEY_ALL_ACCESS; RegOpenKeyEx (hKey, Path, 0, Acc, &ret); } //DispLastError (hWndMain); if (New > 1 and dw eq REG_OPENED_EXISTING_KEY) { RegDeleteKey (hKey, Path); RegCreateKeyEx (hKey, Path, 0, "", 0, Acc, NULL, &ret, &dw); } Exit: return (ret); } /*-------------------------------------------------------------------------*/ WORD WINAPI GetRegVal (HANDLE hKey, LPSTR Entry, LPVOID Val, DWORD Size) { char HStr[70]; WORD len,ret; LONG hl; DWORD hd,hd2; ret = 0; // Error memset (Val, 0, Size); hl = RegQueryValueEx (hKey, Entry, NULL, NULL, (LPBYTE) Val, &Size); if (hl) goto Exit; ret = Size; Exit: return (ret); } /*-------------------------------------------------------------------------*/ LONG WINAPI SetRegKey (HANDLE Hd, LPSTR Entry, LPVOID Value, WORD Fmt) { WORD len; LONG hl; LPSTR LP; HANDLE hKey; hKey = (HANDLE) Hd; Switch (Fmt) case REG_SZ: case REG_EXPAND_SZ: len = strlen((LPSTR)Value) + 1; break; case REG_DWORD: len = 4; break; default: len = 0; }switch hl = RegSetValueEx (hKey, Entry, 0, Fmt, Value, len); return (hl); } /*-------------------------------------------------------------------------*/ VOID WINAPI CloseRegKey (HANDLE hKey) { RegCloseKey (hKey); } /***********************************************************************/ VOID WINAPI DispLastError (HWND hWnd, LPSTR Msg) { char HStr[90]; char Work[256]; LPBYTE LP,Cap,P; int Err,hi; Err = GetLastError(); HStr[0] = 0; hi = FORMAT_MESSAGE_FROM_SYSTEM; LP = Work; Cap = HStr; if (Msg) strcpy (Cap, Msg); P = Cap + strlen(Cap); wsprintf (P, " (%d)", Err); FormatMessage (hi, NULL, Err, 0, LP, 255, NULL); MessageBox (hWnd, LP, Cap, MB_ICONINFORMATION); } //------------------------------------------------------------------------- VOID WINAPI AddPath (HWND hWnd, LPSTR Path) { HANDLE hKey; short ret,len; LONG Err; char c; DWORD hdw; LPSTR LP,PV; WORD hw,CFlag,Plen; ret = 0; LP = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"; hKey = OpenRegKey (HKEY_LOCAL_MACHINE, LP, 0); if (hKey) { Plen = GetRegVal (hKey, "Path", NULL, 0); if (Plen eq 0) DispLastError(hWnd, "Get Path"); hdw = Plen + 150; PV = AllocPtr (hdw); GetRegVal (hKey, "Path", PV, hdw); }else{ DispLastError(hWnd, LP); Plen = 0; } // wenn Pfad noch nicht vorhanden // dann einfuegen if (strstr(PV, Path) eq NULL) { hw = strlen(Path); if (*PV) { memmove (PV+hw+1, PV, Plen); } memcpy (PV, Path, hw); *(PV+hw) = ';'; Err = SetRegKey (hKey, "Path", PV, REG_EXPAND_SZ); Free_Ptr (&PV); } CloseRegKey (hKey); }