2009-06-26 3 views
1

私は作成したばかりの変数の値を取得するためにWin32関数GetEnvironmentVariableを使用しています。私はWindows XPとVC++ 2005を実行しています。Visual Studio内からプログラムを実行すると、新しい変数を見つけることができません。私がコマンドプロンプトから実行すると、それが実行されます。 VC++を再起動しましたが、同じ結果が出ました。私もVisual Studioのすべてのインスタンスを再起動しましたが、それと同じ問題です。私はPCを再起動すれば解決するかもしれませんが、なぜそうなのですか不思議です。ここで私が使用しているコードです: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; 
} 

私は、TEMPとして、存在しなければならない何かでMY_ENV_NAMEを交換した場合、予想通り、それは動作します。何か案は?ありがとう。

答えて

2

ありがとうございました。私の質問で言及したように、私はPCをリブートするだけで、すべてを再開しようとしました。私の環境変数はSYSTEM変数なので、VSはPCを再起動せずにそれを認識しません。 env変数をSYSTEMからUSERに移動してVSを再起動すると、うまくいきました。

3

環境変数を読み取る前に、アプリケーションを再起動してください。コンソールウィンドウを開いてマイコンピュータの環境変数を変更しても、既存のコンソールウィンドウには表示されません。新しい環境変数のコピーを取得するには、それらを再起動する必要があります。

+0

アンダーズ、私はコンソールと同様にビジュアルスタジオ –

+3

を再起動しました。またVisStudioを使い始めたプログラムも再起動しました。アプリケーションは起動時に環境をその親から継承し、変更されません。起動後、コンテキストXの環境への変更はコンテキストYに伝播しません。 –

+0

これは、特に "MyComputer-> Properties"で変更が行われたときに 'GetEnvironmentVariable()'の環境変数を更新する方法が全くないことを意味します - >環境変数 "? – JHowzer

5

AndersとMartinの言葉を拡張すると、環境変数はアプリケーションの起動時に継承されるものです。新しいプログラムは、基本的に起動時の環境のコピーを取得します。デバッグ時には、通常はexeがVisual Studioによって起動されるため、アプリケーションはVisual Studioと同じ環境になります。 Visual Studioは、一般にエクスプローラで起動します。システムプロパティ - >詳細 - >環境変数に移動して環境変数を変更した場合、Visual Studioを再起動して変更を確認する必要があります。

(少なくともVS2005/2008では)Visual Studioに表示される環境変数を参照する必要がある場合は、ツール - >オプション - >プロジェクトとソリューション - > VC++プロジェクトの設定とログの環境を「はい」に設定します。これはビルドログにすべての環境変数を出力します(ビルド出力のリンクをCtrl +クリックします)。あなたはこの情報を得るためにビルドする必要がありますが、これは私がVS環境を知っている最良の方法です。

実際に環境変数を変更して実行する必要があり、デバッグが困難な場合は、デバッグexeをビルドし、デバッグを開始する場所の近くのDebugBreak()を呼び出すことができます。次に、環境を設定したり、エクスプローラやコマンドプロンプトからexeを起動したりすることができます。次に、JITデバッグが有効になっていると仮定すると、コードがDebugBreak()呼び出しに到達したときにポップアップが表示され、VSでそのコードにアタッチしてそこから正常にデバッグできます。

+1

ログの環境を出力することに関する素晴らしいヒント、非常に便利です! –

3

それはすべてあなたが環境変数を設定する方法によって異なります。

  • コマンドプロンプトでset MY_ENV_NAME=valを実行した場合、その後、あなたはcmd.exeのそのインスタンスのMY_ENV_NAMEを設定しているし、すべての子どもが、それは将来的に実行される処理。既存の子プロセスの環境は変更されません。

    この場合、Visual Studio IDEを終了してコマンドライン(エクスプローラではない)から起動すると、その子プロセスに新しい環境変数が表示されます。あなたがMY_ENV_NAMEを設定するには、システムまたはユーザーコントロールパネルまたはsetxコマンドを使用している場合

  • は、あなたが永続的にMY_ENV_NAME設定している、とあなたがコンピュータを再起動した後に、それはすべてのプロセスのために設定されます。また、エクスプローラなどの一部のプロセスでは、環境変数の変更がすぐに反映されることがあります。

    これは、システム環境変数またはユーザーごとの環境変数を設定するかどうかによって、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentまたはHKEY_CURRENT_USER\Environmentというレジストリに新しい環境変数を格納することによって機能します。既存のプロセスには、環境変数の変更がbroadcasting the WM_SETTINGCHANGE message with lParam=="Environment"によって通知されます。このメッセージは、永続的な環境変数をレジストリから再読み込みさせます。 KB104011に詳細があります。

    結果として、システムまたはユーザーコントロールパネルを使用して新しい環境変数を設定すると、Visual Studio IDEを終了してエクスプローラ(コマンドプロンプトではなく)から再起動すると、新しい環境変数。

関連する問題