<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[System Environment updaten]]></title><description><![CDATA[<p>Heyho liebe Leute,</p>
<p>ich habe gerade ein kleines Problem... Die Situation ist folgende:</p>
<p>Ich habe eine Konsolenanwendung, in der ich irgendwann mittels Manipulation der Windows Registry neue System Environments anlege, in etwa so:</p>
<pre><code class="language-cpp">// [...]
HKEY keyConfig;
std::string strVarName = &quot;Varname&quot;;
std::string strVarValue = &quot;Varvalue&quot;;

if(ERROR_SUCCESS != RegOpenKeyExA(HKEY_LOCAL_MACHINE, &quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;, 0, KEY_ALL_ACCESS, &amp;keyConfig))
// [...] Log-Output, etc...

if(ERROR_SUCCESS != RegSetValueExA(keyConfig, strVarName.c_str(), 0, REG_SZ, (const BYTE*)strVarValue.c_str(), strVarValue.size()))
// [...] Log-Output, etc...

RegCloseKey(keyConfig);
// [...]
</code></pre>
<p>Klappt soweit.</p>
<p>Jetzt möchte ich aber die eben hinzugefügten Environments im späteren Verlauf des Programms verwenden - das Problem ist nur, dass der aktuellen Console-Session die neuen Environments nicht bekannt sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich kenn mich mit der WinAPI hier leider zu wenig aus, habe aber probiert eine Message (WM_SETTINGCHANGE) an alle Top-Level-Windows zu senden, wie folgt:</p>
<pre><code class="language-cpp">PDWORD_PTR pdwResult = NULL;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)&quot;Environment&quot;, SMTO_ABORTIFHUNG, 5000, pdwResult);
</code></pre>
<p>Klappt aber auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Hat jemand eine Idee? Wäre super <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Gruß<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239811/system-environment-updaten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Apr 2026 13:09:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239811.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Apr 2009 11:20:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to System Environment updaten on Tue, 28 Apr 2009 11:20:36 GMT]]></title><description><![CDATA[<p>Heyho liebe Leute,</p>
<p>ich habe gerade ein kleines Problem... Die Situation ist folgende:</p>
<p>Ich habe eine Konsolenanwendung, in der ich irgendwann mittels Manipulation der Windows Registry neue System Environments anlege, in etwa so:</p>
<pre><code class="language-cpp">// [...]
HKEY keyConfig;
std::string strVarName = &quot;Varname&quot;;
std::string strVarValue = &quot;Varvalue&quot;;

if(ERROR_SUCCESS != RegOpenKeyExA(HKEY_LOCAL_MACHINE, &quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;, 0, KEY_ALL_ACCESS, &amp;keyConfig))
// [...] Log-Output, etc...

if(ERROR_SUCCESS != RegSetValueExA(keyConfig, strVarName.c_str(), 0, REG_SZ, (const BYTE*)strVarValue.c_str(), strVarValue.size()))
// [...] Log-Output, etc...

RegCloseKey(keyConfig);
// [...]
</code></pre>
<p>Klappt soweit.</p>
<p>Jetzt möchte ich aber die eben hinzugefügten Environments im späteren Verlauf des Programms verwenden - das Problem ist nur, dass der aktuellen Console-Session die neuen Environments nicht bekannt sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich kenn mich mit der WinAPI hier leider zu wenig aus, habe aber probiert eine Message (WM_SETTINGCHANGE) an alle Top-Level-Windows zu senden, wie folgt:</p>
<pre><code class="language-cpp">PDWORD_PTR pdwResult = NULL;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)&quot;Environment&quot;, SMTO_ABORTIFHUNG, 5000, pdwResult);
</code></pre>
<p>Klappt aber auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Hat jemand eine Idee? Wäre super <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Gruß<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702569</guid><dc:creator><![CDATA[PuerNoctis@Offline]]></dc:creator><pubDate>Tue, 28 Apr 2009 11:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to System Environment updaten on Tue, 28 Apr 2009 12:29:19 GMT]]></title><description><![CDATA[<p>Environment Parameter werden beim Start des Prozesses kopiert und werden nicht mehr dynamisch ausgelesen. Der entsprechende Prozess müsste also neu starten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702603</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 28 Apr 2009 12:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to System Environment updaten on Tue, 28 Apr 2009 13:02:00 GMT]]></title><description><![CDATA[<p>Alles klar - danke für die Info <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ein ziemlich identisches Problem gab es übrigens bereits hier im Forum (<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-94503.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-94503.html</a>)</p>
<p>Meine (funktionierende) Lösung ist momentan diese:</p>
<p>Der obige Code blieb erstmal weiterhin bestehen, nur habe ich eine Zeile hinzugefügt:</p>
<pre><code class="language-cpp">SetEnvironmentVariableA(strVarName.c_str(), strVarValue.c_str());
/*
-- Alternativ 'SetEnvironmentVariable' (ohne 'A' am Ende), für Unicode-Variante
*/
</code></pre>
<p>Die Funktion setzt ein Environment für den laufenden Prozess, ohne die System-Environments direkt zu beeinflussen.</p>
<p>Vorher hatte ich probiert, mit dem Shell-Command 'SET' das Environment zu setzen, was aber (bei mir) nicht funktioniert hat:</p>
<pre><code class="language-cpp">system(std::string(&quot;SET &quot; + strVarName + &quot;=&quot; + strVarValue).c_str());
</code></pre>
<p>Mein Fazit, falls jemand System-Environments hinzufügen und verwenden will, ohne den Prozess neu starten zu müssen:</p>
<pre><code class="language-cpp">//[...]
/*
 *      System-Variablen in Windows setzen (dauerhaft)
 */ 
HKEY keyConfig;
std::string strVarName = &quot;Varname&quot;;
std::string strVarValue = &quot;Varvalue&quot;;

if(ERROR_SUCCESS != RegOpenKeyExA(HKEY_LOCAL_MACHINE, &quot;SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment&quot;, 0, KEY_ALL_ACCESS, &amp;keyConfig))
// [...] Log-Output, etc...

if(ERROR_SUCCESS != RegSetValueExA(keyConfig, strVarName.c_str(), 0, REG_SZ, (const BYTE*)strVarValue.c_str(), strVarValue.size()))
// [...] Log-Output, etc...

RegCloseKey(keyConfig);

/*
 *      Sicherheitshalber eine Message an andere Windows senden
 */
PDWORD_PTR pdwResult = NULL;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)&quot;Environment&quot;, SMTO_ABORTIFHUNG, 5000, pdwResult);

/*
 *      Variable nochmal für den momentanen Prozess senden (flüchtig)
 */
SetEnvironmentVariableA(strVarName.c_str(), strVarValue.c_str());
//[...]
</code></pre>
<p>Anmerkungen oder Bedenken zu der Variante sind selbstverständlich erwünscht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Gruß<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702624</guid><dc:creator><![CDATA[PuerNoctis@Offline]]></dc:creator><pubDate>Tue, 28 Apr 2009 13:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to System Environment updaten on Tue, 28 Apr 2009 13:41:04 GMT]]></title><description><![CDATA[<p>SetEnvironmentVariable hat keine Wirkung auf den aktuellen Prozess wenn dieser die CRT Funktion getenv benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702653</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 28 Apr 2009 13:41:04 GMT</pubDate></item></channel></rss>