【问题标题】:Is there a way to set the environment path programmatically in C++ on Windows?有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?
【发布时间】:2010-10-06 15:06:38
【问题描述】:

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

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

【问题讨论】:

    标签: c++ winapi path environment-variables


    【解决方案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 命令只允许您定义本地环境变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-03
            • 1970-01-01
            • 2010-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多