限定しりとり

Windows XP SP3 + Visual Studio 2008 で開発をしています。
(言語に依存しない内容の質問なので、こちらにさせていただきました。)
エクスプローラのコンテキストメニューの新規作成と同等の機能を実装しようとしています。
レジストリから、拡張子ごとに ShellNew キーを取得し、ShellNew キーにある「値」を取得するところまでは問題なくできています。

・この「値」の名称には NullFile、FileName、Data、Command の 4種類がある。
・Command の場合はその文字列値を ShellExecute() などで実行すればよい。
・Command の文字列値中の "%1" は新規作成しようとしているファイル名で置き換えてやればよい。

というところまではわかっているのですが ( Command 以外の種類の内容もわかっていますが、説明は割愛します。)、Command の文字列値中に、"%1" とは別にもう一つ "%2!d!" なるパラメータを持つもの ( ブリーフケース ) があり、これが何なのかがわからなくて困っています。
この "%2!d!" は何のパラメータなのでしょうか。
( もしかすると、"%2" だけ何かに置き換えてやり、"!d!" はそのまま渡せばよいのかもわかりませんが )
ご存知の方いらっしゃいましたらよろしくお願いします。

A 回答 (1件)

はっきり言って全然自信はありませんが・・・。



"!d!"は、『遅延環境変数』"d"の参照ではないかと・・・。
("%1"がファイル名に置き換わるように、"!d!"も何か("!d!"無しだと、ブリーフケースが"C:\Documents and Settings\(user)\デスクトップ"フォルダに作られてしまうので、多分、ドライブ名+ディレクトリ名)に置き換わるのかもしれませんが、はっきりとは分かりません。)
プログラムに実装するとなると「分かりません」では済まないでしょうから、実際に、"!d!"をカレントフォルダのドライブ名+ディレクトリ名に置き換えて実験してみるしかないかと思います。

『遅延環境変数』の参照というのは、コマンド実行直前の環境変数の値を参照するものです。通常、環境変数の参照は"%環境変数名%"の形式で行いますが、試しに、『コマンドプロンプト』上で、

:start
@echo off
set FileName=
for /f "delims=" %%i in ('dir c:\*.txt /b /s') do (set FileName=%%i) && (echo %FileName%)
:end

をバッチファイルとして実行してみてください。"do"以下で環境変数FileNameにファイル名をセットしていますから、"echo %FileName%"でそれが表示されそうですが、実際には、C:ドライブ内のテキストファイルの数だけ、

ECHO は <OFF> です。

が表示されるだけです。一方、"echo %FileName%"を"echo !FileName!"に書き替えて実行すると、C:ドライブ内のテキストファイルのフルパス名が延々と表示されます。

この回答への補足

回答ありがとうございます。
さらに、遅延環境変数について詳しいご説明ありがとうございます。
私は遅延環境変数については全く知りませんでしたので、とても参考になります。

ところで、試してみてわかったことがありますので報告させていただきます。(質問する前に気がつくべきでした。)

レジストリに登録されていない拡張子を新たにレジストリに登録し、その拡張子の ShellNew に対して、「コマンドライン引数をそのままファイルに書き出すプログラム(自作)」を登録して、実際にどのように変換されているのか試してみました。

(1) まず、ブリーフケース同様
"%2!d! %1"
というパラメータを設定したところ、コマンドライン引数は
656194 D:\Path\新規XXXX.YYY
のようになっていました。
%2!d! → 656194
%1 → D:\Path\新規XXXX.YYY
に変換されたようです。
この "656194" という数値は、続けて実行すると同じ値なのですが、PC を再起動して再び実行してみると別の値になっていました。

(2) "%2!d" の "%2" を取り除き、
"!d! %1"
としたところ、コマンドライン引数は
!d! D:\Path\新規XXXX.YYY
のようになっていました。
!d! のみだと変換されませんでした。

(3) "%2!d!" の "!d!" を取り除き、
"%2 %1"
としたところ、コマンドライン引数は
D:\Path\新規XXXX.YYY
のようになっていました。
"%2" のみだと "" になってしまうようです。

以上のことから、"%2!d!" で一つのセットとなっていて、何かの数値に置き換わるということは推測できるのですが、この数値がどういうロジックで決定されるのかは、まるで見当がつきません・・・。

補足日時:2009/11/09 22:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!