1. ホーム
  2. c++

[解決済み] 環境変数 ProgramFiles, ProgramW6432Dir, ProgramFilesDir (x86), CommonProgramFiles のデータの出典は何でしょうか?

2022-01-29 12:17:37

質問

環境変数はどこにあるのですか? ProgramFiles , ProgramW6432Dir , ProgramFilesDir (x86) , CommonProgramFilesProgramData からデータを取得するのですか?

なぜ、これらの環境変数の値を _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 それぞれ