環境変数ではまる

調子に乗って、ActivePerlもx64版なんてものをインストールしてしまい、ここまで書きためていたperlコードが動かなくなって無駄にはまりました。単に、WOW64に対する理解が足りなかっただけなんですけど・・・。

ProgramFiles環境変数

この環境変数ですが、64-bitネイティブのプロセスでは、"C:\Program Files"を返します。しかしながら、WOW64のプロセスでは、"C:\Program Files (x86)"を返します。このトリックのおかげで、PerlもWOW64で動いていれば、従来のコードは、ほとんど影響を受けません。ところが、調子に乗って、64bit版とかインストールするとはまるわけです。

32/64での環境変数の違い

参考程度にsetと打って表示された環境変数のうち、WOW64とネイティブ(64bit)で値が違ったものをここに列記しておきます。

WOW64:

CommonProgramFiles=C:\Program Files (x86)\Common Files
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
ProgramFiles=C:\Program Files (x86)
ProgramW6432=C:\Program Files

ネイティブ環境(64bit):

CommonProgramFiles=C:\Program Files\Common Files
PROCESSOR_ARCHITECTURE=AMD64
ProgramFiles=C:\Program Files

プロセッサアーキテクチャとかは基本的には詐称されているんですね。とはいえ、W6432というサフィックスがついている環境変数までチェックすれば、一応、本当は何なのかを確認することはできると。

余談

ところで、ActivePerl x64版ですが、アンインストールしても、PATH環境変数から、自分のパスを削除してくれません。

まぁ、Windows NTにおいて、もはや、PATHなんて、下位互換のためにあるだけといっても過言ではないのですけどねぇ・・・。DLLはSxSでロードの順番とかは、もう訳わからないことになっているし、ShellExecute経由(Run Asとか、コマンドラインでのstartとかは内部でShellExecuteを呼び出す)で実行するなら、レジストリのAppPathによるリダイレクションを使った方が安全だし、そもそも、PATHに頼ることがセキュリティホールの温床になりかねない現状では、もっと別の方法を検討しないといけないんでしょう。