1

GetEnvironmentVariable()'Path'変数情報を取得するために呼び出すC++プログラムがあります。プログラムを実行しているときに、「MyComputer-> Properties-> Environment Variables」を使用して「Path」変数を変更した場合...プログラムを再起動せずに、更新された「Path」変数を取得することは100%不可能ですか? GetEnvironmentVariable()(およびVisual Studio)。

この投稿で、アンダースKは次のように述べています。

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

これは、更新された「Path」変数を取得する方法が100%ないことを意味しますか?時間を無駄にしているのかどうかわかりません。

また、私はこのようなことを試みましたが、成功しませんでした。

ありがとうございました。

4

4 に答える 4

3

まあ、100%不可能ではありません。そのような環境変数を編集すると、レジストリ キーのみが設定されます。Regedit.exe でそれらを確認し、HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Control\Session Manager\Environment に移動すると、編集ボックスに表示された値のリストが表示されます。ユーザー固有のものは HKEY_CURRENT_USER\Environment に保存されます。

重要なのは、プロセスがこれらの値の使用を開始する正確なタイミングです。プロセスは、それを開始したプロセスから環境を継承できます。これは、CreateProcess() の lpEnvironment 引数によって決まります。NULL を渡して継承することは非常に一般的であるため、開始されたプロセスは変更を認識せず、親から古い環境のコピーを取得します。本当に確実な唯一の方法は、ログオフして再度ログオンすることです。これにより、そのようなプロセスが変更された環境で開始されたという事実を知ることができます。または、試してみてください。

これらのレジストリ キーを実際に読み取ることは、100% 不可能というわけではありません。あまり実用的ではなく、もちろん完全に移植できません。PATH 環境変数は、シェルからプログラムを起動する場合にのみ役立ちます。

于 2012-06-22T19:49:20.590 に答える
2

その意味で動的にする必要がある場合は、間違ったものを使用しています。環境変数を使用しないでください。レジストリ エントリなどを使用してください。

于 2012-06-22T19:54:50.950 に答える
1

環境変数は、レジストリからアプリに直接渡されるのではなく、Explorer によって一度読み取られ、作成された子プロセスによって渡されたり継承されたりします。ただし、アプリケーションがレジストリ値を変更するときに、「環境」を含む文字列を指すWM_SETTINGCHANGEブロードキャスト メッセージを使用してこれらの値を再ロードするようアプリケーションに指示できるメカニズムがあります。lParam

通常、このメッセージは Explorer のみが受け入れますが、独自のアプリケーションでこれを検出し、レジストリから直接データを再度読み取ることができます。

于 2012-06-25T10:21:14.507 に答える
0

親切なレスポンダーのアドバイスから、代わりにレジストリ キーを使用して更新された環境変数を取得することにしました。

仮定:

    DWORD BufferSize = 16383;  
    TCHAR pathVar[16383];

以前は、次のことを行いました。

    GetEnvironmentVariable(_T("Path"),pathVar,16383);

[マイ コンピューター] -> [プロパティ] で更新した場合、更新された Path 環境変数が得られませんでした。

今私がやります:

    DWORD dwRet = RegGetValue(HKEY_LOCAL_MACHINE, 
    _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"), 
    _T("Path"), RRF_RT_ANY, NULL, (PVOID)&pathVar, &BufferSize);

    if(dwRet != ERROR_SUCCESS){
        GetEnvironmentVariable(_T("Path"),pathVar,16383);
    }

レジストリ キーから値を取得します。しかし、何らかの理由RegGetValue()で失敗しGetEnvironmentVariable()た場合は、完全に更新されていない可能性がある を介して値を取得しますが、少なくとも使用できる値を取得します。ご提案いただきありがとうございます。

于 2012-06-27T18:09:12.323 に答える