有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?
Posted
技术标签:
【中文标题】有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?【英文标题】:Is there a way to set the environment path programmatically in C++ on Windows? 【发布时间】:2010-10-06 15:06:38 【问题描述】:有没有办法以编程方式(C++)设置全局 Windows 路径环境变量?
据我所知,putenv 仅为当前应用程序设置它。
直接在注册表中更改 (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)
也是一种选择,但如果有 API 方法我更喜欢?
【问题讨论】:
【参考方案1】:MSDNSays:
调用 SetEnvironmentVariable 没有 对系统环境的影响 变量。 以编程方式添加或 修改系统环境变量, 将它们添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 注册表项,然后 广播 WM_SETTINGCHANGE 消息 lParam 设置为字符串 “环境”。 这允许 应用程序,例如外壳,以 拿起你的更新。请注意, 环境变量的值 此键中列出的限制为 1024 字符。
【讨论】:
需要注意的是“Environment”字符串是UTF16格式的,所以要使用L
前缀。示例代码:SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG, 5000, NULL);
【参考方案2】:
如前所述,要更改机器级别的 PATH,只需更改以下注册表项:
HLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
但您也可以通过更改此注册表项在用户级别设置 PATH:
HKEY_CURRENT_USER\Environment\Path
您还可以通过将 application\Path 详细信息添加到此注册表项来在 应用程序级别设置 PATH:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
【讨论】:
【参考方案3】:没有 API - 更改注册表就是这样做的方法。更改后的值将用于更改后开始的进程。
另外:请注意,正在运行的应用程序必须主动处理设置更改消息,而许多(大多数?)不这样做。
【讨论】:
【参考方案4】:是的,你是对的。 您还需要在不注销的情况下影响这些设置
使用 SendMessageTimeout API 将 borad 转换消息发送到所有窗口 SETTINGCHANGE 参数(LPARAM)“环境”,使用 SMTO_ABORTIFHUNG 几毫秒(5000)。
这就是资源工具包提供的 setX.exe 所做的。
【讨论】:
【参考方案5】:如果你想通过注册表来做,你可能想看看this程序的源代码。
Microsoft 还提供了一个名为 setx 的小型命令行实用程序及其resource toolkits,可让您执行此操作。顺便说一句,我认为常规的 set 命令只允许您定义本地环境变量。
【讨论】:
以上是关于有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件
在 C# 中以编程方式设置 Windows XP Embedded 区域设置