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

标签 c++ winapi registry environment-variables environment

我正在编写一个 Win32 DLL,其中包含一个将目录添加到 Windows PATH 环境变量(将在安装程序中使用)的函数。

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

但是当我启动一个新的命令提示符时(在运行 DLL 之后),我添加的目录没有显示在 echo %PATH% 的输出中,并且我无法访问该可执行文件通过键入其名称位于该目录中。

我认为我的程序在通知系统 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 ... */ }

我的调用顺序是:RegCreateKeyExRegSetValueExRegCloseKeySendMessageTimeout

如果我在控制面板“环境变量”窗口中按“确定”,我的 DLL 对 PATH 所做的更改会显示在新创建的命令提示符中,因此控制面板正在做一些事情来传播 PATH变化;我想弄清楚它是什么并做同样的事情。

有人知道我应该怎么做吗?

我运行的是 64 位 Windows Vista,但我希望它能够在所有 Windows XP、Vista 和 Windows 7 操作系统上运行。

更新: 我上面发布的代码的问题是我没有在“环境”字符串上加上 L 前缀。虽然它没有在我能找到的 Microsoft 文档的任何地方明确说明,但 LPARAM 需要是指向 WCHAR 字符串(2 字节字符)的指针,而不是 CHAR 字符串,这是 Visual Studio 的编译器默认生成的当我写一个字符串文字时。我的问题的解决方案是将“环境”更改为 L“环境”。 (我以为在发布这个问题之前我已经尝试过了,但显然我没有正确尝试!)但是任何想要完成这项任务的 C++ 解决方案的人都应该看看 Dan Moulding 的答案。

最佳答案

事实证明,太阳底下真的没有什么新鲜事。这在以前已经做过了,至少一次。由我。我创建了一个与您描述的完全相同的 DLL(用于从 NSIS 安装程序修改路径)。它被 Visual Leak Detector 使用安装程序。

该 DLL 称为 editenv.dll。 The source可在 github 上找到。我刚刚测试了安装程序,它更新了 system PATH 环境变量,没问题。根据您所写的内容,我认为没有任何明显错误的地方。我也没有看到任何明显的缺失。但可能值得一看 editenv.dll 源代码(您最感兴趣的是 EnvVar.cpp 中的 EnvVar::set() ,可能还有 pathAdd() code> 和 pathRemove() C API 在 editenv.cpp )。

关于c++ - 以编程方式将目录添加到 Windows PATH 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1919125/

相关文章:

Python _winreg key 路径不正确

c++ - 无法从指针访问映射成员

c++ - Stringstreams 不工作 C++

c++ - 如何自定义工具提示的外观? (C++ WinAPI)

delphi - 在delphi中分配一个字节数组并随后释放它

c# - 从注册表中读取字符串值会产生一些垃圾字符

c++ - 如何通过其偏移量访问私有(private)数据私有(private)成员?

c++ - 使用冒号 (':' ) 在 C++ 中访问数组中的元素(在 Rcpp 中)

c# - 如何将字符串发送到其他应用程序,包括 Microsoft Word

C# 向 Windows 资源管理器添加所有文件类型的上下文菜单项