2009-06-26 23 views
1

我使用Win32函數GetEnvironmentVariable來檢索剛創建的變量的值。我正在運行Windows XP和VC++ 2005.如果我從Visual Studio中運行程序,它無法找到新變量。如果我從命令提示符運行它,它會。我重新啓動了VC++,但結果相同。我甚至重新啓動了Visual Studio的所有實例,但仍然是同樣的問題。如果我重新啓動電腦,它可能會得到解決,但我很好奇爲什麼這樣。以下是我正在使用的代碼:VC++不使用GetEnvironmentVariable檢測新創建的env變量

#define BUFSIZE 4096 
#define VARNAME TEXT("MY_ENV_NAME") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TCHAR chNewEnv[BUFSIZE]; 

    DWORD dwEnv = ::GetEnvironmentVariable(VARNAME, chNewEnv, BUFSIZE); 
    if (dwEnv == 0) 
    { 
     DWORD dwErr = GetLastError(); 
     if(dwErr == ERROR_ENVVAR_NOT_FOUND) 
     { 
      printf("Environment variable does not exist.\n"); 
      return -1; 
     } 
    } 
    else 
    { 
     printf(chNewEnv); 
    } 

    return 0; 
} 

如果我將MY_ENV_NAME替換爲必須存在的內容(例如TEMP),它將按預期工作。有任何想法嗎?謝謝。

回答

2

感謝您的所有答覆。正如我在我的問題中提到的,我嘗試重新啓動所有內容,但沒有重新啓動PC。事實證明,因爲我的環境變量是一個SYSTEM變量,VS無法在不重新啓動PC的情況下識別它。當我將env變量從SYSTEM移到USER並重新啓動VS時,它工作正常。

3

請確保您重新啓動應用程序,然後才能讀取環境變量。如果您打開了一個控制檯窗口並更改了「我的電腦」上的環境變量,則這些都不會在任何現有的控制檯窗口中記錄。您需要重新啓動它們以獲取新環境變量的副本。

+0

安德斯,我確實重新啓動了我的遊戲機以及Visual Studio – 2009-06-26 16:07:23

+3

以及您從VisStudio開始的程序。應用程序在啓動時從其「父」繼承其環境,並且不會更改。啓動後,上下文中的環境變化X不會傳播到上下文Y. – 2009-06-26 16:27:10

5

根據Anders和Martin的說法,擴展環境變量是啓動應用程序時繼承的一件事。新程序基本上獲得的啓動時間的副本。在調試時,您的exe通常由Visual Studio啓動,因此您的應用程序將具有與Visual Studio相同的環境。 Visual Studio,通常由資源管理器啓動。如果您通過轉到系統屬性 - >高級 - >環境變量來更改環境變量,則必須重新啓動Visual Studio才能看到更改。

如果您需要查看Visual Studio看到的環境變量,您可以(至少對於VS2005/2008)轉到工具...->選項...->項目和解決方案 - > VC++項目設置和將日誌中的顯示環境設置爲'是'。這將打印出構建日誌的所有環境變量(ctrl +點擊構建輸出中的鏈接)。您必須構建才能獲取此信息,但這是我瞭解VS環境的最佳方式。

如果您確實需要更改環境變量,然後運行並且調試很困難,您可以構建您的調試exe文件,並調用DebugBreak()以在您想要開始調試的位置附近。然後你可以設置你的環境如何,從資源管理器或命令提示符啓動EXE。然後(假設你已經啓用了JIT調試),當你的代碼進入DebugBreak()調用時,你會得到一個彈出窗口,你可以用VS附加到它並從那裏正常調試。

3

這一切都取決於你如何設置環境變量:

  • 如果您在命令提示符下運行set MY_ENV_NAME=val,那麼你已經爲cmd.exe該實例設置MY_ENV_NAME和所有子進程在將來執行。現有子進程的環境未被修改。

    在這種情況下,退出Visual Studio IDE並從命令行(不是資源管理器)啓動它應該使其及其子進程看到新的環境變量。

  • 如果你使用的系統或用戶控制面板或setx命令來設置MY_ENV_NAME,那麼你已經設置MY_ENV_NAME持續,它會爲你重新啓動計算機後,所有的進程設置。另外,您可能會發現某些進程(如Explorer)會立即收到環境變量更改。

    這可以通過將新環境變量存儲在註冊表下的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment來實現,具體取決於您是選擇設置系統環境變量還是每個用戶環境變量。通知現有流程存在環境變量broadcasting the WM_SETTINGCHANGE message with lParam=="Environment"。如果他們知道如何,此消息使他們重新從註冊表中讀取持久性環境變量。 KB104011有更多的細節。因此,如果使用系統或用戶控制面板設置新的環境變量,退出Visual Studio IDE並從資源管理器(不是命令提示符)重新啓動它應導致它及其子進程看到新的環境變量。