[解決済み] 環境変数 ProgramFiles, ProgramW6432Dir, ProgramFilesDir (x86), CommonProgramFiles のデータの出典は何でしょうか?
質問
環境変数はどこにあるのですか?
ProgramFiles
,
ProgramW6432Dir
,
ProgramFilesDir (x86)
,
CommonProgramFiles
と
ProgramData
からデータを取得するのですか?
なぜ、これらの環境変数の値を
_putenv()
?
例えば
_putenv( "ProgramFiles=D:\\MyProgs" );
解決方法は?
64ビットWindowsシステムにおいて、各種環境変数や一部のWindowsレジストリキーの読み取りが リダイレクト は、読み込みを行うプロセスが64ビットか32ビットかによって、異なるソースに変換されます。
下の表は、これらのデータソースの一覧です。
X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
Y = HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion
Z = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
READING ENVIRONMENT VARIABLES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
%ProgramFiles% : X\ProgramW6432Dir X\ProgramFilesDir (x86)
%ProgramFiles(x86)% : X\ProgramFilesDir (x86) X\ProgramFilesDir (x86)
%ProgramW6432% : X\ProgramW6432Dir X\ProgramW6432Dir
%CommonProgramFiles% : X\CommonW6432Dir X\CommonFilesDir (x86)
%CommonProgramFiles(x86)% : X\CommonFilesDir (x86) X\CommonFilesDir (x86)
%CommonProgramW6432% : X\CommonW6432Dir X\CommonW6432Dir
%ProgramData% : Z\ProgramData Z\ProgramData
READING REGISTRY VALUES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
X\ProgramFilesDir : X\ProgramFilesDir Y\ProgramFilesDir
X\ProgramFilesDir (x86) : X\ProgramFilesDir (x86) Y\ProgramFilesDir (x86)
X\ProgramFilesPath : X\ProgramFilesPath = %ProgramFiles% Y\ProgramFilesPath = %ProgramFiles(x86)%
X\ProgramW6432Dir : X\ProgramW6432Dir Y\ProgramW6432Dir
X\CommonFilesDir : X\CommonFilesDir Y\CommonFilesDir
X\CommonFilesDir (x86) : X\CommonFilesDir (x86) Y\CommonFilesDir (x86)
X\CommonW6432Dir : X\CommonW6432Dir Y\CommonW6432Dir
そのため、例えば32ビットプロセスの場合、データのソースである
%ProgramFiles%
と
%ProgramFiles(x86)%
環境変数がレジストリ値
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
.
しかし、64ビットプロセスの場合、そのデータのソースである
%ProgramFiles%
環境変数はレジストリの値
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
...そして、そのデータのソースである
%ProgramFiles(x86)%
環境変数はレジストリの値
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
Windowsのデフォルトインストールでは、このような文字列が
C:\Program Files (x86)
をレジストリ値
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
が、これは変更可能です(他も同様)。
以下は 典型的 これらの環境変数とレジストリ値に含まれるデータです。
READING ENVIRONMENT VARIABLES: Typical data for 64-bit process Typical data for 32-bit process
-------------------------------|----------------------------------------|-----------------------------------------------
%ProgramFiles% = C:\Program Files C:\Program Files (x86)
%ProgramFiles(x86)% = C:\Program Files (x86) C:\Program Files (x86)
%ProgramW6432% = C:\Program Files C:\Program Files
%CommonProgramFiles% = C:\Program Files\Common Files C:\Program Files (x86)\Common Files
%CommonProgramFiles(x86)% = C:\Program Files (x86)\Common Files C:\Program Files (x86)\Common Files
%CommonProgramW6432% = C:\Program Files\Common Files C:\Program Files\Common Files
%ProgramData% = C:\ProgramData C:\ProgramData
READING REGISTRY VALUES: Typical data for 64-bit process Typical data for 32-bit process
------------------------------|----------------------------------------|-----------------------------------------------
X\ProgramFilesDir = C:\Program Files C:\Program Files (x86)
X\ProgramFilesDir (x86) = C:\Program Files (x86) C:\Program Files (x86)
X\ProgramFilesPath = %ProgramFiles% => C:\Program Files %ProgramFiles(x86)% => C:\Program Files (x86)
X\ProgramW6432Dir = C:\Program Files C:\Program Files
X\CommonFilesDir = C:\Program Files\Common Files C:\Program Files (x86)\Common Files
X\CommonFilesDir (x86) = C:\Program Files (x86)\Common Files C:\Program Files (x86)\Common Files
X\CommonW6432Dir = C:\Program Files\Common Files C:\Program Files\Common Files
X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
最終的に、これらのWindowsレジストリ値に入力されたものは、ログイン時にWindowsエクスプローラによってそれぞれの環境変数に読み込まれ、その後に生成される子プロセスにコピーされます。子プロセスはそれ自身の環境変数を
_putenv()
レジストリ値
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPath
は特に注目すべき点で、ほとんどのWindowsのインストールでは文字列
%ProgramFiles%
に、64ビットプロセスで読み込まれるようにする。この文字列は、環境変数
%ProgramFiles%
のレジストリ値からデータを取得します。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
...何らかのプログラムがこの環境変数の値を事前に変更しない限り。
私は、64ビットと32ビットのプロセスについて、これらの環境変数を表示する小さなユーティリティを書きました。 ダウンロードすることができます。
こちら
.
VisualStudio 2017のソースコードが含まれ、コンパイルされた64ビットおよび32ビットバイナリ実行ファイルは、ディレクトリ
..\x64\Release
と
..\x86\Release
それぞれ
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】デバッグアサーションに失敗しました