シェル拡張について – プログラミング – Home

通知
すべてクリア

[解決済] シェル拡張について

固定ページ 1 / 2

poroporo
 poroporo
(@poroporo)
ゲスト
結合: 15年前
投稿: 16
Topic starter  

お世話になります。poroporoです。

タイトル通り、シェル拡張について調べております。
コンテキストメニューの拡張が行いたいのです。
IContextMenuインターフェースを実装する・・・等の情報はググれば出てきますが、いまい
ちどう実装すればよいかわかりません。

http://eternalwindows.jp/shell/shellex/shellex01.html

↑ここのURLを見てもすべてをコピペでビルドができる状態までは情報を公開していないた
め、書かれているクラスを作成してその後どうしたらよいんだ?という状態です。

他に、参考となるサイトなどご存じないでしょうか?

#COMも理解しないと難しいですか?


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

こちらの方に実装例があるようですよ。
http://eternalwindows.jp/shell/shellex/shellex08.html

これ以外にもIClassFactoryインターフェースの実装と
DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer
各関数のエクスポートが必要です。

例は違いますがCOMサーバーの例もありました。
http://eternalwindows.jp/com/comserver/comserver05.html


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

せっかくなのでCOMに関しても勉強された方が良いのでは
と思います。COMの仕組み立てを理解する事で
COMの仕組みに乗っかってどの部分を実装して行く必要が
あるのかを理解できるのではないかなと。
この事は今回の話しに限らず、COMを利用する必要がある
他の場面でも役に立つと思います。
(どこまで踏み込むのかと言う話はあると思いますが)


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

ちなみに、こちらにほぼ完全なコードがあります。
http://eternalwindows.jp/shell/shellex/code/shellex08.html


返信引用
poroporo
 poroporo
(@poroporo)
ゲスト
結合: 15年前
投稿: 16
Topic starter  

>subaruさん、PATIOさん、bunさん

皆さま、ご回答ありがとうございます。
bunさんが提示していただいたURLみたらとりあえず、サンプルのビルドが通るところまでい
き、動作を確認できました。

ただコピペだけで動いたとしても、Windows(explorer.exe?)がどのようにこのDLLを呼び、
実行しているかいまいち理解できません。
※レジストリに登録し、COMオブジェクトであれば、呼べるようですが…
やはり根底にはCOMという技術がかかわっているため、COMオブジェクト自体がWindowsとど
のようなやりとりを行っているのか。。。

Windowsをもっとくわしくなりたいのですが、どうやったら知識を得れるのでしょうか。

業務でプログラムを組んでるだけじゃ無理ですよね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

うーん。

勉強方法と言っても別に画期的な勉強法があるわけでは無いので。

書籍を購入して読むとかWeb上でCOMの解説をしてくれている所を
探して読んでみるとか。
すごく細かい話まで踏み込むと情報量が多くなって大変ですけれど、
COMの骨格とどういう仕組み立てなのかを理解するだけでも
随分違うと思いますよ。
一度で全てを理解しようとするのではなくて段階的に理解していけると
良いかなと思います。そういう勉強の仕方をするのであれば、書籍の方が
よいかなと思いますけれど。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

コピペでも動きますがGUIDは一意なものなので
guidgen.exeで作り直した方がよいでしょう。

>ただコピペだけで動いたとしても、Windows(explorer.exe?)がどのようにこのDLLを呼び、
>実行しているかいまいち理解できません。
DllGetClassObject関数を通してインターフェースの取得が行われます。
この関数にどのような引数が渡されて何を返しているか調べてみてください。
インターフェースの使い方自体はCOMであろうとなかろうと大差ありません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

 アマゾン、紀伊国屋、八重洲ブックセンターのサイトで検索してみては?
気に入った本があったら読んでみることを薦めます。
 MSDN-CDにも説明文があったと思います。
探してみては?


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

COMの知識はあまり必要ではありません。

guidgen.exeを使って自分用のマジックナンバー(GUID)を作れば、
後はソースコードを見ればなんとかなる程度と思います。

サンプル中のThreadingModelとか、
CClassFactoryのAddRef/ReleaseとLockServerの関係とかの理解は
かなり大変です。

それよりも、
サンプルを拡張しながら、つまずいた時に調べるほうがラクと思います。

レジストリについては、Windows7よりも前のmsdnの
Creating Context Menu Handlersに大体書いてあります。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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 がアンロードされます。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

詳細は書籍やWEBに譲るとして、
「COMとはなんぞや?」
という純粋な疑問にだけ答えるなら、
「環境の違いを乗り越えて使用可能な動的リンクライブラリ」
でいいんじゃないでしょうか。
細かいことをいうと違っている部分もありますが、ざっくりなら、その認識でい
いと思います。

COMの代表的な応用例の1つとしてActiveXがあります。
と言えばピンと来るでしょうか?


返信引用
poroporo
 poroporo
(@poroporo)
ゲスト
結合: 15年前
投稿: 16
Topic starter  

>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


返信引用
poroporo
 poroporo
(@poroporo)
ゲスト
結合: 15年前
投稿: 16
Topic starter  

シェル拡張ってVisual Studioのデバッガででばっぐできないんですね。。。
不便です。


返信引用
poroporo
 poroporo
(@poroporo)
ゲスト
結合: 15年前
投稿: 16
Topic starter  

シェル拡張ってVisual Studioのデバッガでデバッグできないんですね。。。
不便です。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

> #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}


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました