1

Win32 関数 GetEnvironmentVariable を使用して、作成したばかりの変数の値を取得しています。Windows XP と VC++ 2005 を実行しています。Visual Studio 内からプログラムを実行すると、新しい変数が見つかりません。コマンドプロンプトから実行すると、実行されます。VC++ を再起動しましたが、結果は同じでした。Visual Studio のすべてのインスタンスを再起動しましたが、それでも同じ問題が発生します。PCを再起動すれば解決するかもしれませんが、どうしてこうなったのか気になります。私が使用しているコードは次のとおりです。

#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 などの存在する必要があるものに置き換えると、期待どおりに機能します。何か案は?ありがとう。

4

4 に答える 4

3

それはすべて、環境変数の設定方法によって異なります。

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

    この場合、Visual Studio IDE を終了し、(エクスプローラーではなく) コマンド ラインから起動すると、Visual Studio IDE とその子プロセスに新しい環境変数が表示されます。

  • システム コントロール パネルまたはユーザー コントロール パネルを使用するか、setxコマンドを使用して を設定MY_ENV_NAMEした場合は、MY_ENV_NAME永続的に設定され、コンピュータを再起動した後にすべてのプロセスに対して設定されます。さらに、Explorer などの一部のプロセスは、環境変数の変更をすぐに取得する場合があります。

    これは、システム環境変数またはユーザーごとの環境変数のどちらを設定することを選択したかに応じて、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentまたはの下のレジストリに新しい環境変数を格納することによって機能します。を使用してメッセージをブロードキャストするHKEY_CURRENT_USER\Environmentことにより、環境変数の変更があったことが既存のプロセスに通知されます。方法がわかれば、このメッセージによってレジストリから永続的な環境変数を再度読み取るようになります。KB104011に詳細があります。WM_SETTINGCHANGElParam=="Environment"

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

于 2009-06-27T11:40:51.430 に答える
3

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

于 2009-06-26T15:58:41.173 に答える
2

すべての応答に感謝します。質問で述べたように、PC の再起動以外はすべて再起動してみました。私の環境変数はSYSTEM変数だったので、VSはPCを再起動しないと認識しないことがわかりました。env 変数を SYSTEM から USER に移動して VS を再起動すると、正常に動作しました。

于 2009-06-29T08:53:59.483 に答える