お世話になります。poroporoです。
タイトル通り、シェル拡張について調べております。
コンテキストメニューの拡張が行いたいのです。
IContextMenuインターフェースを実装する・・・等の情報はググれば出てきますが、いまい
ちどう実装すればよいかわかりません。
http://eternalwindows.jp/shell/shellex/shellex01.html
↑ここのURLを見てもすべてをコピペでビルドができる状態までは情報を公開していないた
め、書かれているクラスを作成してその後どうしたらよいんだ?という状態です。
他に、参考となるサイトなどご存じないでしょうか?
#COMも理解しないと難しいですか?
こちらの方に実装例があるようですよ。
http://eternalwindows.jp/shell/shellex/shellex08.html
これ以外にもIClassFactoryインターフェースの実装と
DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer
各関数のエクスポートが必要です。
例は違いますがCOMサーバーの例もありました。
http://eternalwindows.jp/com/comserver/comserver05.html
せっかくなのでCOMに関しても勉強された方が良いのでは
と思います。COMの仕組み立てを理解する事で
COMの仕組みに乗っかってどの部分を実装して行く必要が
あるのかを理解できるのではないかなと。
この事は今回の話しに限らず、COMを利用する必要がある
他の場面でも役に立つと思います。
(どこまで踏み込むのかと言う話はあると思いますが)
ちなみに、こちらにほぼ完全なコードがあります。
http://eternalwindows.jp/shell/shellex/code/shellex08.html
>subaruさん、PATIOさん、bunさん
皆さま、ご回答ありがとうございます。
bunさんが提示していただいたURLみたらとりあえず、サンプルのビルドが通るところまでい
き、動作を確認できました。
ただコピペだけで動いたとしても、Windows(explorer.exe?)がどのようにこのDLLを呼び、
実行しているかいまいち理解できません。
※レジストリに登録し、COMオブジェクトであれば、呼べるようですが…
やはり根底にはCOMという技術がかかわっているため、COMオブジェクト自体がWindowsとど
のようなやりとりを行っているのか。。。
Windowsをもっとくわしくなりたいのですが、どうやったら知識を得れるのでしょうか。
業務でプログラムを組んでるだけじゃ無理ですよね。
うーん。
勉強方法と言っても別に画期的な勉強法があるわけでは無いので。
書籍を購入して読むとかWeb上でCOMの解説をしてくれている所を
探して読んでみるとか。
すごく細かい話まで踏み込むと情報量が多くなって大変ですけれど、
COMの骨格とどういう仕組み立てなのかを理解するだけでも
随分違うと思いますよ。
一度で全てを理解しようとするのではなくて段階的に理解していけると
良いかなと思います。そういう勉強の仕方をするのであれば、書籍の方が
よいかなと思いますけれど。
コピペでも動きますがGUIDは一意なものなので
guidgen.exeで作り直した方がよいでしょう。
>ただコピペだけで動いたとしても、Windows(explorer.exe?)がどのようにこのDLLを呼び、
>実行しているかいまいち理解できません。
DllGetClassObject関数を通してインターフェースの取得が行われます。
この関数にどのような引数が渡されて何を返しているか調べてみてください。
インターフェースの使い方自体はCOMであろうとなかろうと大差ありません。
アマゾン、紀伊国屋、八重洲ブックセンターのサイトで検索してみては?
気に入った本があったら読んでみることを薦めます。
MSDN-CDにも説明文があったと思います。
探してみては?
COMの知識はあまり必要ではありません。
guidgen.exeを使って自分用のマジックナンバー(GUID)を作れば、
後はソースコードを見ればなんとかなる程度と思います。
サンプル中のThreadingModelとか、
CClassFactoryのAddRef/ReleaseとLockServerの関係とかの理解は
かなり大変です。
それよりも、
サンプルを拡張しながら、つまずいた時に調べるほうがラクと思います。
レジストリについては、Windows7よりも前のmsdnの
Creating Context Menu Handlersに大体書いてあります。
COM の良書は軒並み絶版ですねぇ。
ATL の本ならまだ手に入るかもしれませんが、最新の VC++ とはマッチしないかもしれ
ません。
Inside COM はいい本です。Amazon ではプレミア価格がついてますが。
次点では Essential COM もいい本です。
どちらも絶版です。
> ただコピペだけで動いたとしても、Windows(explorer.exe?)がどのようにこのDLLを
> 呼び、実行しているかいまいち理解できません。
> ※レジストリに登録し、COMオブジェクトであれば、呼べるようですが…
> やはり根底にはCOMという技術がかかわっているため、COMオブジェクト自体が
> Windowsとどのようなやりとりを行っているのか。。。
コンテキストメニューの場合…
explorer は対象のオブジェクト(ファイルとか)のメニューを出す際に、レジストリを
見て DLL をロードします。
DLL がエクスポートしている DllGetClassObject 関数が呼ばれ、この関数が
IClassFactory を実装したオブジェクトを返します。
explorer は IClassFactory::CreateInstance を呼びます。このメソッドがシェル拡張
ハンドラのインスタンスの実態を作って返します。
続いて explorer は、そのインスタンスが実装している IShellExtInit::Initialize
や IContextMenu の各メソッドを呼んでくれます。
処理が終わると各インターフェースポインタが Release され、DllCanUnloadNow 関数を
経て DLL がアンロードされます。
詳細は書籍やWEBに譲るとして、
「COMとはなんぞや?」
という純粋な疑問にだけ答えるなら、
「環境の違いを乗り越えて使用可能な動的リンクライブラリ」
でいいんじゃないでしょうか。
細かいことをいうと違っている部分もありますが、ざっくりなら、その認識でい
いと思います。
COMの代表的な応用例の1つとしてActiveXがあります。
と言えばピンと来るでしょうか?
>PATIOさん、subaruさん、ITOさん、ロマさん、aetosさん、bunさん
ご回答ありがとうございます。
guidgen.exeで新規GUIDを作成して実施しました。
#中のCLSIDって、UUIDのことなのですね。GUIDであったり…ややこしいです
COMの動作がなんとなくつかめてきました。
が、わかればわかるほど、Windowsの中継している機能がどのような作りになっているか気
になってきました。
COMの書籍は紀伊国屋に行ってもないんですよね。。。
私自身、この業界で仕事しているのになんともWebで買い物するのに抵抗があるんです。
そのため、
ActiveXって、OCXですよね?存在は知っていても使ったことがないですよね。
#Creating Context Menu Handlersってこれですか?
http://msdn.microsoft.com/en-us/library/cc144171(VS.85).aspx
シェル拡張ってVisual Studioのデバッガででばっぐできないんですね。。。
不便です。
シェル拡張ってVisual Studioのデバッガでデバッグできないんですね。。。
不便です。
> #Creating Context Menu Handlersってこれですか?
msdnONLINEのやつはどうも複雑です。
VS2003付属のmsdnCDでは以下の記述があります。
サンプルと多少違ってますが、拡張子とDLLとの対応が分かると思います。
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
CLSID
{00000000-1111-2222-3333-444444444444}
InProcServer32
(Default) = C:\MyDir\MyCommand.dll
ThreadingModel= Apartment
shellex
MayChangeDefaultMenu
MyProgram.1
(Default) = MyProgram Application
shellex
ContextMenuHandler
MyCommand={00000000-1111-2222-3333-444444444444}