Wert für Registry Key setzen



  • Hallo!

    Ich setze in meinem Programm einen RegKey wie folgt:

    RegCreateKeyEx(HKEY_LOCAL_MACHINE, 
                   TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"), 
                   0,	0, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, 0);
    
    char String[16] = ""; 
    strcpy (String,strIP);         
    RegSetValueEx(hKey,"KEY_NAME",0,REG_SZ,(CONST BYTE*)String, strlen(String)+1); 
    RegCloseKey(hKey);
    

    Ein Blick in die Umgebungsvariablen über die Eigenschaften des Arbeitsplatzes zeigt mir, dass auch soweit alles bestens funktioniert.
    Das Problem ist jetzt jedoch, dass ich direkt danach eine Funktin aufrufe, die eine DLL verwendet, die genau diesen Wert ausliest, der aktuellen Wert jedoch erst nach einem Reboot drin steht.
    Liegt das daran, dass die Umgebungsvariable nur für diesen Prozess angelegt wird? Eigentlich sollte sie doch dann Systemweit bekannt sein?

    Wie kann ich das ändern?

    Gruß
    Sebastian



  • Hallo Sebastian.

    Ich weiss zwar nicht genau, was du in C++ machen musst.
    Ich habe ein Loginscript das mit Winbatch geschrieben ist.
    Dort setze ich Variabeln auf die selbe weise.
    am schluss mache ich noch folgendes

    WININICHG=26
    DaDll=Strcat(DirWindows(1),"USER32.DLL")
    DllCall( DaDll, long:"SendMessageA", long:-1, long:WININICHG, long:0, lpstr:"Environment")
    

    dann sind die Variabeln aktiv.

    ich hoffe, das hilft dir etwas.

    Gruss Roger



  • The user can add or modify system environment variables using the Control Panel. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message. This allows applications, such as the shell, to pick up your updates.

    Applications should send WM_SETTINGCHANGE to all top-level windows when they make changes to system parameters. (This message cannot be sent directly to a window.) To send the WM_SETTINGCHANGE message to all top-level windows, use the SendMessageTimeout function with the hwnd parameter set to HWND_BROADCAST.



  • Hallo!

    Erstmal vielen Dank für eure Hilfe! Das mit der WM_SETTINGCHANGE Nachricht hatte ich auch gelesen, oder eher wohl überlesen 😉

    Habe meine Code jetzt folgendermaßen geändert:

    RegCreateKeyEx(	HKEY_LOCAL_MACHINE, 
    					TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"), 
    					0,
    					0,
    					REG_OPTION_VOLATILE,
    					KEY_ALL_ACCESS,
    					NULL,&hKey,0);
    
    char String[16] = ""; 
    strcpy (String,strIP);         
    long err = RegSetValueEx(hKey,"REG_KEY_NAME",0,REG_SZ,(CONST BYTE*)String, strlen(String)+1);
    
    int lParam, wParam = 0;
    LPCTSTR lpBuf = "Environment";
    lParam = (int)lpBuf[0];
    DWORD *aResult = 0;
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, wParam, lParam, SMTO_NORMAL, 1, aResult);
    

    Dabei hab ich mir als Vorlage diese Seite angeschaut:
    http://bdn.borland.com/article/0,1410,28254,00.html

    Aber trotzdem funktioniert es noch nicht so, wie es soll.
    Die Funktion, die aufgerufen wird nutzt weiterhin die alte IP, obwohl in der Umgebungsvariable die neue schon drin steht.
    Liegt das vielleicht an den Flags oder den Param's?

    Gruß
    Sebastian



  • Also erstmal würde ich den Timeout wieder etwas raufsetzen (im Borland-Code wird ja auch 4000 verwendet). Ansonsten denke ich, dass du im lParam direkt lpBuf übergeben müsstest 🙄
    Aber falls die andere Anwendung diese Message eh ignoriert, dann hast du wohl verloren 😞



  • Okay danke, hab das jetzt nochmal geändert. Aber nach wie vor das gleiche verhalten. Hab aber gemerkt, dass wenn ich die neue IP setze und dann die Anwendung neu starte, auch die richtige IP benutzt wird. Also quasi "...Änderungen werden erst nach Neustart übernommen..." 🙄
    Das ist halt doof. Ob die andere Anwendung die Message ignoriert weiß ich im Moment noch net so genau, wird sich zeigen.

    Ansonsten werd ich solang mal mit nem Neustart der Anwendung leben müssen.
    Trotzdem Danke nochmal!

    Gruß
    Sebastian



  • Student schrieb:

    Ob die andere Anwendung die Message ignoriert weiß ich im Moment noch net so genau, wird sich zeigen.

    Offenbar. Zumindest würde ich das daraus schließen, dass sie die Änderungen ja übernimmt, wenn du die Software neu startest (ohne Windows-Neustart) 🙄


Anmelden zum Antworten