スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コンテキストメニュー拡張事前調査

ご要望コメントありがとうございます。検討しますね。
実はあんまりだらだら作ってるので、何を改造しようとしていたのか忘れてきてるんですけどね。orz

テキストファイル操作クラスを作ったので、ログを出して動作を確認しながら進めています。
ファイル等を右クリックした際に最初に呼び出されるのが、IShellExtInit::Initialize関数です。

HRESULT Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);

MSDNヘルプが英語版しか見あたらないのが私には辛いですが、それによれば(おそらく)pidlFolderはコンテキストメニュー拡張の場合には、フォルダが対象の場合にセットされるようです。ドラッグアンドドロップ拡張(右ボタンでのドラッグアンドドロップ)の場合には、ドロップ先のフォルダのアイテムIDリストがセットされるようです。

pdtobjは、いわゆるデータオブジェクトというもの(説明になってない)ですね。(^^;
これに対する調査は後回しにします。

hkeyProgIDはファイルまたはフォルダのレジストリキーだそうです。今まで使ったことが無かったんですが、今回念のために調べてみました。例えばテキストファイルを右クリックした場合、このレジストリキーの既定値を取得してみます。すると

'テキスト ドキュメント'

という文字列が取得できました。これはおそらく
HKEY_CLASSES_ROOT\txtfile
であると思われます。Excelのファイルの場合には、

'Microsoft Excel ワークシート'

が取得できます。おそらく、HKEY_CLASSES_ROOT\.xlsの既定値はExcel.Sheet.8ですので、そこからHKEY_CLASSES_ROOT\Excel.Sheet.8の既定値が取れているのだと思われます。

戻り値は特に何も問題なければNOERRORを返すとのことです。

最初にこれを試したとき、IContextMenu::QueryContextMenuはS_OKを返すだけの実装にしていました。すると、思いがけない動きをして、なんとIShellExtInit::InitializeとIContextMenu::QueryContextMenuが交互に4回ずつ呼ばれていたんです。IShellExtInit::Initializeは呼ばれるたびにhkeyProgIDの値が異なっていました。う~ん、これはどういう仕様なんでしょうね?(^^;
1回目の呼び出しでは'テキスト ドキュメント'が取得できるんですが、2回目以降は空文字列なので、何のキーなのか分からないんですよね。
ちなみにIContextMenu::QueryContextMenuでメニューを追加するように仮実装すると、1回しか呼ばれなくなりました。

まあ大したことじゃないんですが、メニューを追加しなかった場合にどこが呼ばれてるのかを念のため調べてみました。テキストファイルの場合、以下の順番で呼ばれているようです。

HKEY_CLASSES_ROOT\txtfile
HKEY_CLASSES_ROOT\*
HKEY_CLASSES_ROOT\SystemFileAssociations\text
HKEY_CLASSES_ROOT\AllFilesystemObjects

まあ、結局使い道が思いつきません。(^^;
関連記事

comment

Secret

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
カテゴリー
最近の記事
最近のコメント
タグ

カメラ GH2 GH3 

ブログ内検索
月別アーカイブ
RSSフィード
プロフィール
●オンラインソフト作家。しかし長らく活動休止中。
ソフトウェア

●Dさんの長押しIME起動2
●IME+ (仮称)

・Dさんの長押しIME起動。
・Dさんの日本語じゃなきゃイヤン。
・Dさんの名前変更お手伝い。
・Dさんのダイヤルアップ接続お手伝い。
・DさんのWindows終了お手伝い。

・お忍びランチャー。
・お忍びリネーム。
・デジくいっくサーチ!
・Simple Remote
・計算王?

※過去の開発ソフトの一部はリンク先からダウンロードできます。

リンク
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。