【发布时间】:2013-07-05 13:50:59
【问题描述】:
如何使用 QT 4.8 获取和设置 PATH 变量?我知道我可以使用 getenv 从 STL 获取 PATH 变量值,但不知道如何使用 STL 或任何基于 Qt 的方法设置它?
如果 QT 有它的功能,我想知道并使用它,而不是去使用它的 Windows API。
【问题讨论】:
标签: c++ qt4 environment-variables
如何使用 QT 4.8 获取和设置 PATH 变量?我知道我可以使用 getenv 从 STL 获取 PATH 变量值,但不知道如何使用 STL 或任何基于 Qt 的方法设置它?
如果 QT 有它的功能,我想知道并使用它,而不是去使用它的 Windows API。
【问题讨论】:
标签: c++ qt4 environment-variables
感谢我的朋友Toosi先生,您可以使用qputenv("key", "value")为当前进程设置环境变量,并使用qgetenv("key")获取它。
这也适用于 Qt 5.5.0 :)
【讨论】:
您可以使用 stdlib.h 中的 setenv 将 PATH 设置为新值。
setenv("PATH","/new/path/value",1)
但是,这是标准标头的非标准扩展,只会影响调用进程产生的子进程。为了更改所有新进程的环境变量,必须使用系统特定的方法。对于 Windows,PATH 变量可以在
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
注册表项。这将确保为所有新进程设置 PATH,并将在重新启动时应用。
【讨论】:
PATH,那么您需要使用 Windows API 将所需的更改添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key,这将更改任何推出了新的应用程序。您所做的更改也将在重新启动后继续存在。
我使用此代码处理 Registry 值:
包括:
#include <windows.h>
阅读:
QSettings setting( "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", QSettings::NativeFormat );
QString pathVal = setting.value("Path", "no-path").toString();
要写:
setting.setValue( "Path", path );
SendMessageA( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment" );
通过这种方式,我无需重新加载程序即可获得实际的Path 值,并将该值广播到所有进程。
无法从这个答案中首先意识到如何使用SendMessage:
How to modify the PATH variable definitely through the command line in Windows。
我想我应该在 Visual Studio 中创建一个Win32 应用程序,然后在其中发送此消息。
但是这个函数应该在注册表改变之后被调用。所以我可以手动编辑注册表值,然后按下一个名为SendMessageA 和Path 更新的按钮。
顺便说一句,SendMessage 宏调用了SenMessageW 函数,但它不起作用,Path 没有改变。不知道A 是什么意思,但它改变了变量。
【讨论】: