1. 程式人生 > >程式修改Windows環境變數生效

程式修改Windows環境變數生效

修改Windows環境變數生效

bruce | 五月 27,2005 12:37
http://blog.9zi.com/post/1/805

不少程式需要新增各自的環境變數,方便定製性使用。用得最多的是使用者指定目錄如JAVA_HOME等變數,程式中可以根據獲取變數%JAVA_HOME%,來獲取對應設定的字串。


一般做法是安裝的時候就指定,或者程式中設定。

用批處理臨時設定環境變數就不提了,這裡講讓環境變數始終生效。

一般做法是修改環境變數登錄檔。

整個Windows都有效的環境變數在
HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment
中設定

對當前使用者有效的環境變數在
HKEY_CURRENT_USEREnvironment
中設定

其實只是簡單的元資料

但往往修改玩後無法即時生效,往往需要重啟系統。

要解決即時生效的問題,可以再在我的電腦屬性中設定環境變數中確定一下即可。

依此看來,這個過程肯定是讀取了登錄檔,再呼叫一個系統函式來更新整個系統的變數。一定可以程式設計解決的。

可惜網海茫茫,收不到。

一不做二不休,直接下載開啟innosetup的程式碼,搜尋Environment,果真找到了。

很簡單:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);

發一個全域性的廣播,等待各自相應後,立即生效。

  { Note: We originally used SendNotifyMessage to broadcast the message but it
    turned out that while it worked fine on NT 4 and 2000 it didn't work on XP
    -- the string "Environment" in lParam would be garbled on the receiving
    end (why I'm not exactly sure). We now use SendMessageTimeout as directed
    in the KB article 104011. It isn't as elegant since it could cause us to
    be delayed if another app is hung, but it'll have to do. }

Log It,以備後來者檢索。