2011-10-20 54 views
1

在我的Installscript項目中,我需要重啓以註冊環境變量的值。但我希望該應用程序應該無需重新啓動即可設置。那麼他們有什麼方法來刷新環境變量的值,以便我的應用程序獲得註冊並且不需要重新啓動? 我已經使用下面的代碼行:刷新環境變量的值

define WM_WININICHANGE 0x001A' 
define HWND_BROADCAST 0xffff' 
szEnv = "Environment"; 
pEnv = &szEnv; 
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, pEnv);` 

是他們是任何其他方式來刷新環境變量的值? 我在Windows XP上運行這個。

+1

如果您使用** InstallShield 2010或更高版本** - 上述代碼將無法使用。看到這裏的解決方案:http://stackoverflow.com/questions/2103790/batch-file-cant-immediately-see-environment-variables-created-by-installshield/20362751#20362751 –

回答

0

設置環境變量的Windows進程無法訪問該變量以進行讀取。這在Windows中是一個限制。這個想法是,如果你的進程設置了一個變量,它已經知道變量的值。

因此,如果您的安裝程序正在設置一個環境變量,那麼您的應用程序必須運行在一個獨立且不相關的進程中才能讀取該變量。這就是爲什麼在安裝完成時啓動應用程序不起作用。

解決方案是在安裝期間啓動變量值時,通過應用程序命令行傳遞變量值。將來的任何啓動都將直接訪問該變量。

0

發送WININICHANGE消息到廣播地址是正確的事情。但是,並不要求所有正在運行的進程正確地對該消息進行子類化並更新其進程的環境變量。他們應該這樣做,但並非總是如此。這個最臭名昭着的例子就是服務控制管理器。您必須重新啓動SCM以查看新變量/值。

現在,如果您問「如何獲取當前運行過程以查看此值?」 (科斯明似乎認爲這是你的要求,但我不知道,如果你是或不是),那麼答案就在於認識到環境空間有四個類別:

用戶 機 過程 揮發性

http://msdn.microsoft.com/en-us/library/6s7w15a0(v=vs.85).aspx

你的代碼的作用是爲SYSTEM設置環境變量var。這就像以前那樣在autoexec.bat(SET FOO = BAR)中放入一行並重新啓動。但是你也可以從windows創建一個新的dos提示符並執行SET SOMETHING = ELSE,並且只會在該進程和子進程的生命週期中看到它,而不會看到其他進程。這是「過程」空間與「系統」空間。此外,如果您使用新變量更新了AUTEXEC.BAT並創建了新過程而無需重新啓動,它將不會看到新變量,但您可以始終自己設置並查看它(儘管技術上不是同一個變量)。

我知道,使用SendMessage你不需要重新啓動,但不管所有的進程都不會收到消息。

所以,如果你需要當前的InstallScript進程也有這個新變量,你需要調用Kernel32的SetEnvironmentVariable函數,該函數根據MSDN「爲當前進程設置指定環境變量的內容」。

有趣的InstallScript有一個GetEnvVar函數,但不是一個SetEnvVar函數,所以你必須把它作爲外部函數原型化,然後調用它。

與樣品的討論可以發現here