ファイル移動なし起動への未練

移動なし起動 - 永字八法の続き
コメントで示唆をいただいたので試してみた。
NScripterのファイル指定の際、%TEMP%などは展開されない。それが結論である。
しかし一方で少し道が見えた。%TEMP%を取得できれば、それを置き換えることで対応できる。そのため、getregに注目しレジストリをほじくってみた。
結論としてレジストリの中には環境変数を記録する部分はない。(少なくとも、HKEY_CURRENT_USER下には)が、一方で、二つのキーを組み合わせることで対応できそうな予感がある。

  1. HKEY_CURRENT_USER\Volatile Environment\APPDATAと
  2. HKEY_CURRENT_USER\Environment\TEMP or HKEY_CURRENT_USER\Environment\TMP

を使う。
このマシンの実値を調べると、

  1. C:\Documents and Settings\(ユーザー名)\Application Data
  2. %USERPROFILE%\Local Settings\Temp

となっている。
「%USERPROFILE%」の部分がAPPDATAでは「C:\Documents and Settings\(ユーザー名)」に展開されているのがわかる。
よって文字列を切り貼りすれば、「C:\Documents and Settings\(ユーザー名)\Temp」を得ることが可能になる。
しかし当然ながらこの方法が通用するのは、ユーザーが環境変数に手を加えていないことが前提になる。(多分、レジストリ環境変数をいじるようなユーザーは少数だと思う。特に、「これ、移動とかなしで起動できない?」とか聞いてくるようなヌルいユーザーには。主観だが)
対応策として、この方法で作成した一時ファイル置き場のディレクトリが存在するかどうかをチェックすることを考えるが、なんとfileexistはstart節専用命令であってdefine節の中では使えないのである。(savedirがdefine節専用命令であるからには、全てをdefine節内で片付けなければならない)
となれば、見切り発車をするしかないのだろうか。
前回も記述した「ディレクトリを作成できるDLL」と併用するならば、「HKEY_CURRENT_USER\Volatile Environment\APPDATA」だけ取得すればこと足りると思う。例えレジストリに変更があったとしても、少なくともそこに記述されているディレクトリは存在するとみなしてよいのだから、その下にアプリケーション独自のディレクトリを作っておけば問題はない。
えーと、でも確か以前作ってもらったよな。ファイルとかディレクトリとか作成するDLL。あ、でもあれ、もしかしたら絶対パスによる指定は受け付けないようにしたんだっけか? うーん。