簡體   English   中英

以編程方式將目錄添加到Windows PATH環境變量

[英]Programmatically adding a directory to Windows PATH environment variable

我正在編寫帶有將目錄添加到Windows PATH環境變量(將在安裝程序中使用)的函數的Win32 DLL。

在運行DLL之后查看Regedit或“控制面板”中的環境變量,可以看到我的DLL已成功將路徑添加到HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\EnvironmentHKEY_CURRENT_USER\\Environment

但是,當我啟動新的命令提示符(運行DLL之后)時,添加的目錄不會顯示在echo %PATH%的輸出中,並且無法通過鍵入其名稱來訪問該目錄中的可執行文件。

我認為我的程序不能很好地通知系統PATH已更改,或者可能是在更改完全生效之前通知它們。 我閱讀了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。 來源可在github上找到。 我剛剛測試了安裝程序,它更新了系統 PATH環境變量,沒問題。 根據您所寫的內容,我認為沒有什么是錯的。 我也看不到任何明顯的缺失。 但它可能是值得看看editenv.dll源(你最感興趣的EnvVar::set()EnvVar.cpp ,也可能是pathAdd()pathRemove() ç的API在editenv.cpp )。

我有一個程序可以調用與您相同的Win32 API來更新環境,並且它可以正常工作。

要注意的一件事是如何打開命令提示符。

如果通過執行以下操作打開命令提示符:

Start -> Run -> cmd.exe

然后提示中的環境將顯示已設置新變量。

但是,我在鍵盤上還有一個可編程功能鍵,已將其設置為運行cmd.exe進程。 如果我通過該功能鍵打開命令提示符,然后鍵入env ,則不會顯示已設置的變量。

我不確定為什么它會以不同的方式工作,但是它必須與cmd.exe進程的啟動方式有關(盡管兩者都以我的用戶名而不是SYSTEM )。

您如何打開命令提示符?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM