2009-02-10 67 views
16

有沒有辦法以編程方式設置全局Windows路徑環境變量(C++)?

據我所知,putenv只爲當前應用程序設置它。
直接在註冊表中更改(HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)也是一個選項,但我更喜歡API方法,如果有的話?有沒有辦法在Windows上用C++編程設置環境路徑?

回答

23

MSDN Says

調用SetEnvironmentVariable方法對系統環境變量 沒有 效果。 以編程方式添加或 修改系統環境變量, 將它們添加到 HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \控制\會話 經理\環境的註冊表項,然後 廣播WM_SETTINGCHANGE消息 與lParam的設置爲字符串 「環境」 。這允許 應用程序(例如shell)到 接收更新。請注意,此項中列出的環境變量 的 值限制爲1024 個字符。

+1

需要注意的是,「Environment」字符串是UTF16格式,所以你應該使用`L`前綴。示例代碼:`SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)L「Environment」,SMTO_ABORTIFHUNG,5000,NULL);` – izogfif 2015-10-23 14:13:02

3

沒有API - 更改註冊表是實現它的方法。更改的值將用於更改後開始的進程。

另請注意,運行的應用程序必須主動處理設置更改的消息,許多(大多數?)不這樣做。

2

如果您想通過註冊表完成,您可能需要查看this程序的源代碼。

微軟還提供了一個名爲setx的小命令行實用程序,其resource toolkits可讓您執行此操作。順便說一下,常規設置命令只是讓你定義我認爲的本地環境變量。

2

是的你是對的。 您還需要在不註銷BORAD鑄造於所有Windows SETTINGCHANGE的參數(LPARAM)「環境」與SMTO_ABORTIFHUNG使用SendMessageTimeout API幾毫秒(5000)

發送消息給這些設置生效。

這是資源工具包提供的setX.exe。

9

正如前面所指出的,在機水平改變路徑只是改變此註冊表項:

HLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 

但你還可以通過更改此註冊表設置在用戶級別的PATH項:

HKEY_CURRENT_USER\Environment\Path 

而且你還可以通過添加應用程序\路徑DETA設定在應用水平的PATH ils to this registry entries:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\