VBのプログラムのCLSIDを取得するには?

解決


すう  2004-07-28 10:30:24  No: 115123  IP: [192.*.*.*]

こんにちは。
VB6.0のプログラムを、エクスプローラ上で任意のファイルの右クリックメニューから選択起動するようにしたいです。レジストリに登録するプログラムのIDを取得(生成?)する方法がわからないのですが、ご教示いただけると助かります。

編集 削除
マグ  2004-07-28 11:15:21  No: 115124  IP: [192.*.*.*]

HKEY_CLASSES_ROOT→*→Shell→任意の名前→Command

がすべてのファイルのみです。

ついでに、念のためレジストリエディター上で確認しといてください。

編集 削除
マグ  2004-07-28 11:18:17  No: 115125  IP: [192.*.*.*]

ミスをしました。
すみません。

>エクスプローラ上で任意のファイルの右クリックメニュー

任意のファイルですから、

*の部分がその自分の決めた拡張子になります。

例えば) WAVEファイルだったら、  .wav
となります。

編集 削除
すう  2004-07-28 13:06:06  No: 115126  IP: [192.*.*.*]

質問の仕方が不十分でした。補足させてください。Adobeがインストールしてある場合、Explorer上のファイル右クリックで「AdobePDFへの変換」などメニューに出ます。同じことをしたく、レジストリをみたところ、
、HKEY_CLASSES_ROOT/*/Shellex/ContextMenuHandlers/Adobe.Acrobat.ContextMenuキーが登録され、その中のデータがCLSIDとなっています(ProgIDというのでしょうか)。このCLSIDは、コンパイルしたプログラムの中に自動的に設定されているのか、あるいは自分でプログラムと関連付けて設定するのか(VisualStudioにCLSID値の生成ツールがあるのはWebで検索されました)わからず困っています。インストーラはInnoSetup4を使いたいと思っています(インストーラでレジストリ登録しディレクトリ・ドライブに対し自分のプログラムの右クリックメニューを出すことはできました)。
少し長くなってしまいすみません。

編集 削除
魔界の仮面弁士  2004-07-28 13:37:17  No: 115127  IP: [192.*.*.*]

シェルエクステンションの作成ですか。
そうしますと、適切なインターフェイスをImplementsしたActiveX DLLを
作成し、それをレジストリに登録する事になります。

# ただし、VB6では、インターフェイスを定義できませんので、
# ODL等でタイプライブラリを作成し、それを参照設定する必要があります。

作成したActiveX DLLのIIDやCLSID等を調べる方法はいくつかありますが、
私の場合は、OLEVIEW.EXE を利用する事が多いです。

> VisualStudioにCLSID値の生成ツールがあるのはWebで検索されました
CLSIDというか、GUID(グィード)ですね。ファイル名は GUIDGEN.EXE です。

> HKEY_CLASSES_ROOT/*/Shellex/ContextMenuHandlers/Adobe.Acrobat.ContextMenuキーが登録され、
ContextMenuHandlers を実装するのであれば、「IContextMenuインターフェイス」について調べてみてください。

編集 削除
すう  2004-07-30 17:35:44  No: 115128  IP: [192.*.*.*]

どうもありがとうございます。教えていただいたキーワードで検索したところ、
http://www.oreilly.com/catalog/vbshell/chapter/ch04.html
がありました。
①ここからタイプライブラリをカット&ペーストで作りVBで参照設定
②ここからソースをカット&ペーストで作りActiveX DLLを作成
お恥ずかしいですがコンパイルエラーがとれないです。
同ページのExample4-4
Public Declare Function ReleaseStgMedium Lib "ole32.dll" _ 
    (pMedium As STGMEDIUM) As Long

Private Sub IShellExtInit_Initialize( _
    ByVal pidlFolder As VBShellLib.LPCITEMIDLIST, _
    ByVal pDataObj As VBShellLib.IDataObject, _
    ByVal hKeyProgID As VBShellLib.HKEY)
で、
「コンパイルエラー:ユーザ定義型は定義されていません」が出力されます。
タイプライブラリのライブラリ名はVBShellLibにしました。申し訳ありませんが
原因がおわかりの方がいらしたら、お教えいただけると助かります。

編集 削除
魔界の仮面弁士  2004-07-30 18:20:05  No: 115129  IP: [192.*.*.*]

http://www.oreilly.com/catalog/vbshell/chapter/ch04.html
> がありました。
比較的読みやすく書かれているので、個人的にはお奨めの本です。
シェル操作について、VBユーザー向けに書かれた資料は少ないので、
SDKと併読してみてください。(洋書なのが難点ですが…)

> ここからタイプライブラリをカット&ペーストで作りVBで参照設定
自作する以外にも、その本の vbshell_example.zip に含まれる
Vbshell.tlb を使うという方法もあります。それ以外の物としては、
Eduardo A. Morcillo 氏の作成されたライブラリも有名かと。

> 「コンパイルエラー:ユーザ定義型は定義されていません」が出力されます。
たとえば、STGMEDIUM等がタイプライブラリに正しく定義されていなかったりはしませんか?


なお、シェルエクステンションを作成する場合は、システムのバックアップ(レジストリ等)を
取っておく事をお奨めします。もし、作成したDLLにバグがあったりすると、
「ファイル等を右クリックするだけで、Explorerが落ちてしまう」なんて事も
ありえますから。。。

編集 削除
すう  2004-08-02 12:34:43  No: 115130  IP: [192.*.*.*]

回答いただき感謝いたします。自分のタイプライブラリに替えてEduardo A. Morcillo氏のサイトからtblをダウンロードして参照し、ソースを修正しました。しばらく考えましたが、コンパイルエラーの原因がわからないです(号泣)
「コンパイルエラー:プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
エラーの場所:
Private Sub IContextMenu_GetCommandString( _
    ByVal idCmd As Long, _
    ByVal uType As olelib.GetCommandStringFlags, _
    ByVal pwReserved As Integer, _
    ByVal pszName As Long, _
    ByVal cchMax As Integer)
Eduardo A. Morcillo氏の宣言:
    HRESULT GetCommandString(
        [in] long idCmd,
        [in] GetCommandStringFlags uType,
        [in, out] int *pwReserved,
        [in] long pszName,
        [in] int cchMax);
インタフェースとメソッドは判別しています。また下記はコンパイルできました:
自分のソース:
Private Sub IShellExtInit_Initialize( _
    ByVal pidlFolder As Long, _
    ByVal pDataObj As olelib.IDataObject, _
    ByVal hKeyProgID As Long)
Eduardo A. Morcillo氏の宣言:
    HRESULT Initialize (
        [in] LONG pidlFolder,
        [in] IDataObject *lpIDataObject,
        [in] LONG hkeyProgID);
本当に申し訳ありませんが、おわかりでしたら教えてください。

編集 削除
魔界の仮面弁士  2004-08-02 13:08:49  No: 115131  IP: [192.*.*.*]

> 「コンパイルエラー:プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
「イベントプロシージャ」や「Implementsによる実装」を書く場合には、
プロシージャの宣言を手書きするのではなく、コードウィンドウ上部の
コンボボックスにて宣言を作成するようにして下さい。

手書きした場合、「データ型」「引数の数」「ByVal/ByRef」等が
間違っていた際に、その『宣言と一致していません』エラーになります。


> Private Sub IContextMenu_GetCommandString( _
幾つかの引数宣言に違いがありますよね。
この部分のコードを消して、宣言を作成しなおしてみてください。

編集 削除
すう  2004-08-03 18:24:10  No: 115132  IP: [192.*.*.*]

自動的に宣言したらうまくいきました(その後も鬼のようにコンパイルエラーが出ましたが)。こちらの掲示板がなければ途方もなく時間がかかったはずです。本当にどうもありがとうございました。

編集 削除
すう  2004-08-03 18:27:21  No: 115133  IP: [192.*.*.*]

InnoSetup4でアンインストール時に削除する設定を使いました。でもレジストリのバックアップをとっておくべきだというアドバイスは役立ちました。

編集 削除