19

有没有办法以编程方式(C++)设置全局 Windows 路径环境变量?

据我所知, putenv 只为当前应用程序设置它。
直接在注册表(HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)中更改也是一种选择,但如果有的话我更喜欢 API 方法?

4

5 回答 5

26

MSDN

调用 SetEnvironmentVariable 对系统环境变量没有影响。要以编程方式添加或修改系统环境变量,请将它们添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 注册表项,然后广播 WM_SETTINGCHANGE 消息,并将 lParam 设置为字符串“Environment”。这允许应用程序(例如 shell)获取您的更新。请注意,此键中列出的环境变量的值限制为 1024 个字符。

于 2009-02-10T12:35:12.193 回答
12

如前所述,要在机器级别更改 PATH只需更改此注册表项:

HLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

但您也可以通过更改此注册表项在用户级别设置 PATH:

HKEY_CURRENT_USER\Environment\Path

您还可以通过将 application\Path 详细信息添加到此注册表项来在应用程序级别设置 PATH:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
于 2009-02-11T02:39:16.563 回答
3

没有 API - 更改注册表就是这样做的方法。更改后的值将用于更改后开始的流程。

另外:请注意,正在运行的应用程序必须主动处理设置更改消息,并且许多(大多数?)不这样做。

于 2009-02-10T12:02:30.400 回答
2

如果您想通过注册表进行操作,您可能需要查看程序的源代码。

Microsoft 还提供了一个名为 setx 的小型命令行实用程序及其资源工具包,可让您执行此操作。顺便说一句,我认为常规的 set 命令只允许您定义本地环境变量。

于 2009-02-10T12:12:36.600 回答
2

是的,你是对的。您还需要在不注销的情况下影响这些设置

使用 SendMessageTimeout API 使用 SMTO_ABORTIFHUNG 将 borad 转换消息发送到所有窗口 SETTINGCHANGE 参数(LPARAM)“环境”,持续几毫秒(5000)。

这就是资源工具包提供的 setX.exe 所做的。

于 2009-02-10T12:43:49.550 回答