有没有办法在 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++) 从其他用户帐户读取文件

Windows C++ 纳秒计时?

在 Windows 中以编程方式设置正在“收听”的音频设备

在 C# 中以编程方式设置 Windows XP Embedded 区域设置

如何在 Windows 上使用 C++ 在特定音频设备上播放声音?

Windows 上的 Thrift / Google 协议缓冲区