スポンサーサイト

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

お忍びリネーム改造・続き

昨日は疲れて寝てしまいましたが、今日はちょっと進めようと思います。
この日記は正しい作り方を載せているわけではありません。むしろ全体的に自信が無く、作っていく上で自分が気になっていたり悩んだりしている点を書いていくだけです。(^^; 間違いも多々あるかもしれませんが、同じように悩んでる方には参考になる点ももしかしたらあるかもしれません。
さて、シェル拡張です。私が初めてシェル拡張を実装したのは、「Dさんの名前変更お手伝い。」の開発時ですので1999年1月かその前の年くらいのようです。もう10年くらい前のことになりますが、恐ろしいことにその時にCOMの知識は全くありませんでした。(^^;;;
書店でCOMという本が置いてあっても、これは自分には全く関係ない本だという認識でした。当時はシェル拡張に関する情報も非常に少なかったと思いますので、よく組めたなーと何かしら冷たいものを感じつつも感心します。
私が持っている書籍の中でシェル拡張について記載がされているものは、「Windows 95 ユーザーインターフェイスプログラミング」と「Microsoft Windows 95 プログラマーズガイド」という本があります。この2冊を参考にしつつ、MSDNのヘルプも確認しながら、場合によってはWebで他の人のコーディングを参考にして進めたいと思います。COMについてはいろんな書籍が手元にありますので、そちらも参考にします。
COMは利用が進むにつれ実装方法も進歩しているようで、書籍によっても実装方法がずいぶん変わってますので、その辺りを学びつつ進められると良いと思います。

前置きが長くなりましたが、最初はシェル拡張のためのCOMクラスを表現するC++クラスを形作ろうと思います。前のお忍びリネームはコンテキストメニュー拡張(いわゆるファイルの右クリックメニューの拡張)だけでしたが、今回はドラッグアンドドロップ拡張(右ドラッグアンドドロップ時に表示されるメニューの拡張)も追加するかもしれません。自分が仕事の時によく使う操作を単純化する機能を加えたいので。これら2つのシェル拡張の違いは、レジストリへの登録場所だけです。ただ、実現したい機能がドラッグアンドドロップ拡張でうまくいくかどうかはまだ分かりません。

必要なインターフェイスは

・IShellExtInit
・IContextMenu

の2つだけです。IShellExtInitにはメソッドが1つしかありません。IContextMenuは3つです。とりあえずこれらのインターフェイスの外側を作りつつ、最初の目標はファイルのコンテキストメニューにダミーのメニューを追加するところまでとします。ここまで実装すれば、各ファイルがシェルからどのような形でシェル拡張に渡されてくるかを確認することができるようになります。COMを勉強することにより、私の実装方法、書籍の実装方法、ネットで見かける実装方法について少し疑念がありますので、それが解決できれば良いなーと思います。

クラス名はCShellExtにします。CShellExtensionでも良いですが。やっぱりCShellExtensionにしますか。COMの実装方法は、「自力」で行きます。(^^; まだまだ習熟度が足りないので、自分で理解しながら作りたいのと、ATLについてもそれ以上に把握できていないので便利なところだけ使うようなこともできないためです。(ATLのCOM関係についてです。それ以外はところどころ利用します。)

2つのインターフェイスはC++の多重継承で実装します。すなわち、この2つのインターフェイスのIUnknownメソッドは共通のものとなります。

virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG __stdcall AddRef() = 0;
virtual ULONG __stdcall Release() = 0;

マクロを使用する方法もありますが、本質が見えなくなる気がするので上記でいきます。
試しにビルドしてみたら、IShellExtInitとIContextMenuが解決できませんでした。調べてみると、shlobj.hが必要なようです。さて、ここで私のC++の力量不足が露呈します。(これ以前に露呈してるかもしれませんが・・・。)shlobj.hをどこにインクルードすべきかが分かりません。一番簡単な方法はProject.hに入れてしまうことですが、実際に使用が想定されるのはCShellExtensionだけかな・・・?というわけで、ShellExtension.hにインクルードしようかと思います。循環参照のような問題を避けるために、ヘッダーファイルには他のヘッダーファイルを「できるだけ」インクルードしないことが書籍などでは薦められています。この「できるだけ」の範囲が私には分かりません。shlobj.hのような予め用意されたヘッダーファイルが私が作るクラスを参照することはあり得ないので、この場合は問題ないでしょうか?私の場合、基本クラスを定義してあるヘッダーファイルはインクルードしてしまっています。そうしないと利用する側のファイルが、インクルードするヘッダーファイルが使用しているヘッダーファイルを延々とインクルードしないといけなくなってしまうためです。
C#だとクラスに対してはすべてが参照であるからこのような循環参照のことを考えなくて良いってことですかね。C++だとメンバとするクラスを前方宣言し、そのポインタをメンバとするのが定石なんでしょうか?この場合だと自動的にコンストラクタとデストラクタを呼んでくれないので、newする手間が増える上に、delete忘れの危険性があると思います。忘れるほど大層なクラスを作るの?って言われると・・・。(^^;;;

今日は、IShellExtInitとIContextMenuのメンバをヘッダーファイルに記述するところまで終わりました。次は、これらにIUnknownの実装と、IShellExtInitとIContextMenuのダミー実装を追加します。予定では、その次にクラスファクトリ、それからDLLに必要なエントリを追加って感じですかね。

ちまちま作るのもいいですね。(^^)

関連記事

comment

Secret

カレンダー
05 | 2017/06 | 07
- - - - 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 -
カテゴリー
最近の記事
最近のコメント
タグ

カメラ GH2 GH3 

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

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

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

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

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

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