2009-02-10 66 views
16

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

据我所知,putenv只为当前应用程序设置它。
直接在注册表中更改(HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)也是一个选项,但我更喜欢API方法,如果有的话?有没有办法在Windows上用C++编程设置环境路径?

回答

23

MSDN Says

调用SetEnvironmentVariable方法对系统环境变量 没有 效果。 以编程方式添加或 修改系统环境变量, 将它们添加到 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\会话 经理\环境的注册表项,然后 广播WM_SETTINGCHANGE消息 与lParam的设置为字符串 “环境” 。这允许 应用程序(例如shell)到 接收更新。请注意,此项中列出的环境变量 的 值限制为1024 个字符。

+1

需要注意的是,“Environment”字符串是UTF16格式,所以你应该使用`L`前缀。示例代码:`SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)L“Environment”,SMTO_ABORTIFHUNG,5000,NULL);` – izogfif 2015-10-23 14:13:02

3

没有API - 更改注册表是实现它的方法。更改的值将用于更改后开始的进程。

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

2

如果您想通过注册表完成,您可能需要查看this程序的源代码。

微软还提供了一个名为setx的小命令行实用程序,其resource toolkits可让您执行此操作。顺便说一下,常规设置命令只是让你定义我认为的本地环境变量。

2

是的你是对的。 您还需要在不注销BORAD铸造于所有Windows SETTINGCHANGE的参数(LPARAM)“环境”与SMTO_ABORTIFHUNG使用SendMessageTimeout API几毫秒(5000)

发送消息给这些设置生效。

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

9

正如前面所指出的,在机水平改变路径只是改变此注册表项:

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

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

HKEY_CURRENT_USER\Environment\Path 

而且你还可以通过添加应用程序\路径DETA设定在应用水平的PATH ils to this registry entries:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\