• 締切済み

コンテキストメニューの新規作成のコマンドについて

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!" はそのまま渡せばよいのかもわかりませんが ) ご存知の方いらっしゃいましたらよろしくお願いします。

みんなの回答

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.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:ドライブ内のテキストファイルのフルパス名が延々と表示されます。

tsukasa-12r
質問者

補足

回答ありがとうございます。 さらに、遅延環境変数について詳しいご説明ありがとうございます。 私は遅延環境変数については全く知りませんでしたので、とても参考になります。 ところで、試してみてわかったことがありますので報告させていただきます。(質問する前に気がつくべきでした。) レジストリに登録されていない拡張子を新たにレジストリに登録し、その拡張子の 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!" で一つのセットとなっていて、何かの数値に置き換わるということは推測できるのですが、この数値がどういうロジックで決定されるのかは、まるで見当がつきません・・・。

関連するQ&A

  • コンテキストメニューを編集したいのですが

    Windows Vistaを使っています。 さきほどOpenOffice.orgをインストールしたら、コンテキストメニューの「新規作成(W)」のところに ・OpenDocument 図形描画 ・OpenDocument プレゼンテーション ・OpenDocument 表計算 ・OpenDocument テキスト の4つの項目が新たに作成されてしまいました。 Web検索するとHKEY_CLASSES_ROOTの各拡張子にある「ShellNew」というキーを削除すると 消すことができるらしいのですがOOoの関連ファイルの拡張子には「ShellNew」というキーがありませんでした。 一体どうすれば消すことができるでしょうか?

  • 右クリックの新規作成について

    先ほど 右クリックで txt形式を新規作成しようとしました。 しかし、txt形式が新規作成の一覧の中に見つかりませんでした。 そこで、再起動やTweak UIや、レジストリ(.txtには ShellNewキー、その中に文字列値NullFileは存在していましたが、値は何も設定されていませんでした)で復旧を試みましたが、できませんでした。 notepad++をアンインストールしたあとのことです。 そのあと、txt形式はサクラエディタに関連付けられました。 関連付けをnotepadにしても、何も変わりません。 解決方法を知っていらしたら、教えてください。

  • 特定のレジストリを消す方法は?

    レジストリファイルからレジストリを追加するのは解るのですが、逆に特定のレジストリを削除する方法を教えてください たとえばコンテキストメニューの新規作成でテキストドキュメントを削除したい場合は.txtのShellNewキーを削除すればいい この削除した状態を記憶(実行)させたいです ShellNewキーを削除した状態で[.txt]キーをエクスポートし、その後ShellNewキーを戻した状態でエクスポートした物を実行してもShellNewキーが消えません 余計なソフトはなるべくインストールしたくないのでよろしくお願いします

  • コンテキストについて

    パターンマッチを用いて、変数$numに、文字列$strが正の整数の場合はその値を代入し、そうでない場合はデフォルト値として定数を代入したいのですが、 ($num) = ($str =~ /^([1-9][0-9]*)$/) || 1; としても、正の整数としてマッチした場合でも、||の影響で||の左辺がスカラーコンテキストとして評価され、真値としての1が代入されて上手くいきません。 上記の用件を1行で満たすPerlらしいスクリプトがあったら是非教えてください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • レジストリエディタ エントリの作成の仕方

    レジストリの修正をしたいのですが、 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc」キーを開き、その中に次のエントリを作成し値を設定します。 エントリ名「msacm32.drv」、種類「文字列値(REG_SZ)」、値「msacm32.drv」 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32」キーを開き、その中に次の2つのエントリを作成し値を設定します。 エントリ名「wavemapper」、種類「文字列値(REG_SZ)」、値「msacm32.drv」 エントリ名「midimapper」、種類「文字列値(REG_SZ)」、値「midimap.dll」 と書いてある通りにしたいのですが、どなたか分かりやすく説明していただけないでしょうか

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを取得するためには どうすればよいでしょうか? MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です"); この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 よろしくお願いします。

  • レジストリの文字列から

    レジストリの設定でキーがオープンに成功し、キーの値を取得したとき(キーの種類は文字列)その値がフォルダを生成できるかのチェックはどのようにしたらいいでしょうか?例C:\BACKUP(成功)、C:BACKUP(失敗)

  • 得た変数に対応する値をMySQLから取得する際のコマンド

    こんにちは。 +-----------+------------+ | key_sports......| val_sports..........| +-----------+------------+ | baseball............| America...........| +-----------+------------+ | football.............| England.............| +-----------+------------+ | sumou...............| Japan................| +-----------+------------+ 上記内容を例にして、 質問させていただきます。 C++のプログラム内に MySQLから値を取得する意図を満たすソースを挿入しました。 プラグラム動作中に得る変数「key」から得る値を、 MySQLの「key_sports」の列の値とし、 「key」で指定した「key_sports」の値に対応する 「val_sports」の値を取得したいと思っています。 上記例では、 たまたまプログラム内から得たkeyが「baseball」だったとすると、 MySQLより「America」という値を取得したい感じです。 その際に必要となるコマンドというのは、 どのようになるものでしょうか? 最初、コマンドが以下内容かと思いましたが、 どうも適切に値が取得できていませんでした。 どう直せばいいでしょうか? select val_sports from test007 where key_sports = @key  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ※table名:test007 CentOS内でC++のソースを書いていました。 アドバイスいただけますとありがたいです。 宜しくお願い致します。

  • (Vista)ショートカットの作成ウィザードが起動しない

    Vistaを使用していますが、ショートカットの作成ウィザードが起動しなく、ショートカットが正常に作成できません。 デスクトップの何もないところ→右クリック→新規作成→ショートカット と、操作すると、通常はショートカットの作成ウィザードが起動しリンク先やショートカット名を入力するとショートカットが作成されますが、ウィザードが表示されなく、いきなり新規ショートカットが作成されてしまいます。 作成されたショートカットのプロパティは、リンク先と作業フォルダが白抜き状態で、変更ができません。 Win98やWin2000の対処方法(HKEY_CLASS_ROOT¥.LNK\ShellNewのCommand値の修正)は、Webで見つけたのですがキーの内容が異なります。 ダメもとで試してはみたのですが、Vistaには効果がありませんでした。 お助けください!

  • C言語で取得した文字列を、C++の文字列として取り扱いたいです。

    C言語で取得した文字列を、C++の文字列として取り扱いたいです。 皆さんこんにちは。 C言語で取得したchar型で定義された文字列を、 C++の「std::string」に渡したいと思っております。 どうすればかなうでしょうか? 具体的には次のような内容です。 ■C言語側 ---- char key1 = "deperture"; ---- ■C++側で「key1 = key2」としたいです。 ---- std::string key2 = key1; ---- C言語側で記述されている「key1」の値(deperture)を、 C++ソース内の「key2」に渡したいと思っています。 こうゆう場合、どんな方法をとれば適切でしょうか。 C言語側でのchar型の文字列の値を、 C++側の「std::string」型として C++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。