REG_EXPAND_SZ

W32_GETREGSHELL/COMMANDを実装しました。


SHELLとCOMMANDコマンドは同じもので、コマンドシェルを起動して標準出力の結果を返すルールです。
これは、Hamigaki.Processを使えば簡単に実装できます。


一方、W32_GETREGはレジストリの読み出しを行う組み込みルールで、サポートしているデータ型はREG_EXPAND_SZ、REG_MULTI_SZ、REG_DWORD、REG_SZです。
問題はREG_EXPAND_SZです。
REG_EXPAND_SZは環境変数(%〜%)を含んだ文字列で、呼び出し側でこれを展開する必要があります。
まさにこのための関数ExpandEnvironmentStrings()が用意されているのですが、なぜかCygwinではうまく展開できません。
調査の結果、

  • PATHなど特別なものを除き、環境変数は削除される
  • 元の環境変数は名前を大文字に変えた上で大域変数environに設定される

というCygwinの仕様に気が付きました。
このため、REG_EXPAND_SZに含まれる環境変数が見つからず、展開できなかったわけです。
事実上、cygwinでExpandEnvironmentStrings()は使い物にならないということですね。
テストプログラムでもcygwinの場合はREG_EXPAND_SZのチェックはしないようにしています。
必要ならenvironを参照して自前で展開することになりますが、オリジナルのbjamで動いてないので、とりえず無視です。