2010-02-16 127 views
3

我目前正在編寫一個非託管的C++程序,它與系統環境變量一起工作。我使用GetEnvironmentVariable(...)獲取了值。 現在我有一個C#程序,它可以隨時改變這個變量,例如,像這樣:從c + +更新系統環境變量

Environment.SetEnvironmentVariable("CalledPath", System.Windows.Forms.Application.ExecutablePath, EnvironmentVariableTarget.Machine); 

的問題是,除非我重新啓動程序,是不是真正的C++程序不會自動更新這個變量(或一般的環境塊),因此我仍然用舊值工作好。 有沒有辦法更新環境塊或最好是讀取系統環境變量的另一種方式?

由於提前, 拉索

+1

我不認爲有可能更新正在運行的程序的環境。 – Tronic

回答

2

謝謝你們,但我終於明白了我自己。 由於我使用GetEnvironmentVariable接收的值不是當前值,我直接從註冊表中讀取值。 本機環境變量存儲在

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

我通過RegOpenKeyEx(...),並且工作得很好的RegQueryValueEx(...)函數讀取它們。

-1

看運行putenv() - 一C運行功能(或MS優選_putenv()和_putenv_s() - 對C++當量用於更新

GETENV ()和環境中的字符串相似讀取。

ķ

+0

我不認爲這會影響另一個正在運行的進程的環境 – Mark

+0

是的,如果我正確地閱讀這個問題會有所幫助:-) –

-1

我相信這是_putenv()在Windows上。

+0

我認爲這不會影響另一個正在運行的進程的環境 – Mark

+0

當然不是 - 您必須分叉一個進程來繼承環境。 –

+0

OP正試圖傳遞變量而不重新傳遞給它的程序 – Mark

1

你不能。每個進程都獲取其父級的環境變量的副本。由於它只獲取副本,因此無法更改父級的環境或其他任何正在運行的進程的環境。

4

長話短說,環境變量不可能作爲進程間通信的一種形式可靠地工作 - 你確實需要切換到別的東西。

爲了工作,這兩個程序都需要訪問一些常見的環境變量塊 - 但實際上,每個進程都有自己獨立的一組環境變量。更糟糕的是,大多數典型的(C和C++)標準庫不允許你直接使用,而是使用環境變量的另一個副本供您使用。當/如果您致電getenv()_putenv(),則只涉及程序的環境變量塊的內部副本。這意味着即使您可以更改進程的環境變量,運行在該進程仍然的程序也不會獲取新數據。

所以,你真的需要重新考慮你在做什麼。從一個程序向另一個程序發送數據的可能性有批次,包括Windows消息(例如WM_COPYDATA),匿名或命名管道,郵槽,共享內存區域,套接字等。該列表很長,但是仍然不包括環境變量。

0

在您所展示的調用的上下文中,您將盡可能長時間地保持環境變量更改。請參閱EnvironmentVariableTarget枚舉的this MSDN explanation

隨着EnvironmentVariableTarget.Machine設置,您現在使用的變量的變化會持續,只要你的程序的進程中運行,因此所有其他進程將能夠讀取該變量在程序執行期間:

存儲環境變量或從 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment鍵檢索Windows 操作系統註冊表中的 。

當用戶在設置操作創建環境 變量,則 操作系統存儲在系統 註冊表 環境變量,但不在當前 過程。 如果本地 機器上的任何用戶啓動新進程,則操作系統會將 環境變量從註冊表 複製到該進程。

當進程終止時, 操作系統破壞在這一進程中 環境變量。 但是,註冊表中的環境變量 仍然存在,直到用戶 以編程方式或通過 將其刪除爲操作系統工具。 [強調地雷]