Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从c+;设置当前用户环境变量+;对其他进程(如CMD)可见的代码_C++_Windows_C++11_Batch File_Environment Variables - Fatal编程技术网

C++ 从c+;设置当前用户环境变量+;对其他进程(如CMD)可见的代码

C++ 从c+;设置当前用户环境变量+;对其他进程(如CMD)可见的代码,c++,windows,c++11,batch-file,environment-variables,C++,Windows,C++11,Batch File,Environment Variables,我需要为当前用户设置一个本地环境变量,它应该对其他进程可见,比如新的命令提示符。我在windows上需要它。我尝试了像PTENV这样的选项,从C++代码中编辑注册表,但是新的CMD提示符看到了旧的值。首先,我需要编辑路径变量以及一些自定义环境变量。如果我能得到一个工作样本代码,将不胜感激 请注意,环境变量需要在程序执行后保持不变 我的要求是windows。我甚至尝试从C++代码中运行SETX,它运行良好,但是对于路径变量,它将其修剪为1024个字符,并且我丢失了更新。有解决办法吗 如果我的措辞对

我需要为当前用户设置一个本地环境变量,它应该对其他进程可见,比如新的命令提示符。我在windows上需要它。我尝试了像PTENV这样的选项,从C++代码中编辑注册表,但是新的CMD提示符看到了旧的值。首先,我需要编辑路径变量以及一些自定义环境变量。如果我能得到一个工作样本代码,将不胜感激

请注意,环境变量需要在程序执行后保持不变

我的要求是windows。我甚至尝试从C++代码中运行SETX,它运行良好,但是对于路径变量,它将其修剪为1024个字符,并且我丢失了更新。有解决办法吗

如果我的措辞对要求感到困惑。我需要与使用setx完全相同的行为。
提前感谢。

setx命令实际上是在注册表中设置值的可执行文件。如果您希望模拟可以设置比当前进程持续时间更长的环境变量的行为,则需要将其写入
HKCU\environment
键。用于当前用户,可以在无提升权限的情况下写入


使用
RegEdit.exe
reg.exe query HKCU\Environment
查看当前设置。在C/C++中,您可以使用。如果可以,我建议使用ATL类,因为它遵循RAII并确保正确清理句柄。

setx命令实际上是一个可执行文件,用于在注册表中设置值。如果您希望模拟可以设置比当前进程持续时间更长的环境变量的行为,则需要将其写入
HKCU\environment
键。用于当前用户,可以在无提升权限的情况下写入


使用
RegEdit.exe
reg.exe query HKCU\Environment
查看当前设置。在C/C++中,您可以使用。如果可以,我建议使用ATL类,因为它遵循RAII并确保正确清理句柄。

如果从进程启动Cmd.exe,则可以控制其环境。环境变量从父进程继承。调用
CreateProcess
时,也可以覆盖它们

如果更改注册表中的用户/系统环境配置(
HKCU\environment
/
HKLM\system\CurrentControlSet\Control\Session Manager\environment
)并注销/重新启动,则第一个进程将使用这些新的默认值

如果您更新注册表,则可以通过广播以下命令通知其他应用程序在不注销的情况下刷新其环境:


实际上,只有Explorer.exe对该消息作出反应,但这足以影响从任务栏/开始菜单启动的新应用程序。

如果从进程启动Cmd.exe,则可以控制其环境。环境变量从父进程继承。调用
CreateProcess
时,也可以覆盖它们

如果更改注册表中的用户/系统环境配置(
HKCU\environment
/
HKLM\system\CurrentControlSet\Control\Session Manager\environment
)并注销/重新启动,则第一个进程将使用这些新的默认值

如果您更新注册表,则可以通过广播以下命令通知其他应用程序在不注销的情况下刷新其环境:


实际上,只有Explorer.exe会对此消息做出反应,但这足以影响从任务栏/开始菜单启动的新应用程序。

我会有根据地猜测,您已在注册表中正确设置了内容,但正在运行x64-32虚拟化。您的cmd窗口是否与您的应用程序具有相同的比特数?我可以有根据地猜测,您已在注册表中正确设置了内容,但您正在运行x64-32虚拟化。cmd窗口的位是否与应用程序的位相同?BroadcastSystemMessage始终挂起,如果我将标志设置为无挂起,它将返回0。BroadcastSystemMessage始终挂起,如果我将标志设置为无挂起,它将返回0。
BroadcastSystemMessage(0, 0, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"));