2017-03-26 42 views
0

我需要爲當前用戶設置本地環境變量,並且它對其他進程(如新命令提示符)可見。我需要它的窗口。我嘗試了像putenv這樣的選項,並從C++代碼編輯註冊表,但是新的cmd提示符查看舊值。首先,我需要編輯PATH變量以及幾個自定義env變量。將欣賞,如果我能得到一個工作示例代碼。從C++代碼設置當前用戶環境變量對其他進程(如cmds)可見

請注意,環境變量需要堅持過去的程序執行。

我的要求是針對windows。我甚至嘗試從C++代碼運行setx並且它工作正常,但是對於PATH變量,它將它修剪爲1024個字符,並且我失去了更新。有沒有解決這個問題的方法?

如果我的措詞看起來令人困惑的要求。我需要完全相同的行爲,如果我使用setx。 在此先感謝。

+0

我會做一個有教養的猜測,你已經正確地在註冊表中設置的東西,但你正在進入x64-32虛擬化。您的cmd窗口與您的應用程序相同嗎? –

回答

1

setx命令實際上是一個在註冊表中設置值的可執行文件。如果您想要模擬可以設置比當前進程更長的環境變量的行爲,則需要將其寫入HKCU\Environment鍵。 HKCU適用於當前用戶,可以在沒有提升權限的情況下寫入。使用RegEdit.exereg.exe query HKCU\Environment查看當前設置。從C/C++中,您可以使用Registry functions。如果可以,我推薦使用ATL CRegKey類,因爲它遵循RAII,並確保手柄得到適當的清理。

2

如果從您的進程啓動Cmd.exe,您可以控制其環境。環境變量是從父進程繼承的。當您致電CreateProcess時,它們也可以被覆蓋。

如果更改註冊表(HKCU\Environment/HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)中的用戶/系統環境配置並註銷/重啓,則第一個進程將使用這些新的默認設置。

如果更新註冊表,你可以告訴其他應用程序來刷新自己的環境,而無需通過廣播註銷一個message

BroadcastSystemMessage(0, 0, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment")); 

在現實中它是唯一能夠反應此消息,但是這是不夠的Explorer.exe以影響從任務欄/開始菜單啓動的新應用程序。

+0

BroadcastSystemMessage總是掛起,如果我設置標誌爲不掛起,它將返回0。 – zzy