代码之家  ›  专栏  ›  技术社区  ›  David Grayson

以编程方式将目录添加到Windows PATH环境变量

  •  15
  • David Grayson  · 技术社区  · 15 年前

    在DLL运行后查看Regedit或控制面板中的环境变量,可以看出我的DLL已成功将路径添加到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment HKEY_CURRENT_USER\Environment

    但是,当我启动一个新的命令提示符时(在运行DLL之后),我添加的目录不会显示在的输出中 echo %PATH%

    我认为我的程序没有很好地通知系统路径已更改,或者可能是在更改完全生效之前通知他们。我读了一本书 article by Microsoft 那就是说要广播 WM_SETTINGCHANGE

    DWORD result2 = 0;
    LRESULT result = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
        (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, &result2);
    if (result == 0){ /* ... Display error message to user ... */ }
    

    我打电话的顺序是: RegCreateKeyEx RegSetValueEx , RegCloseKey , SendMessageTimeout

    如果我在控制面板的“环境变量”窗口中按“确定”,我的DLL对路径所做的更改将显示在新创建的命令提示中,因此控制面板正在进行一些传播路径更改的操作;我想弄清楚这是什么,然后做同样的事情。

    有人知道我该怎么做吗?

    2 回复  |  直到 14 年前
        1
  •  12
  •   Dan Moulding    15 年前

    事实证明确实如此 阳光下的任何新事物。这之前已经做过,至少一次。是我。我创建了一个DLL,与您描述的完全相同(用于修改NSIS安装程序的路径)。它被用户使用 Visual Leak Detector 安装程序。

    The source 系统 PATH环境变量,没有问题。根据你写的,我看不出有什么明显的错误。我也没有看到任何明显的缺失。但是值得一看editenv.dll源代码(您最感兴趣的是 EnvVar::set() 在里面 EnvVar.cpp ,可能还有 pathAdd() pathRemove() C中的API editenv.cpp

        2
  •  0
  •   LeopardSkinPillBoxHat    15 年前

    我有一个程序,它调用相同的Win32 API来更新您的环境,并且运行良好。

    需要注意的一件事是 您正在打开命令提示符。

    如果通过执行以下操作打开命令提示符:

    Start -> Run -> cmd.exe
    

    cmd.exe 过程如果我通过该功能键打开命令提示符,然后键入 env ,它不显示正在设置的变量。

    命令提示符 SYSTEM ).

    如何打开命令提示符?