###始めに Windows7以降には上記のCOMがサポートされているが、 Vista向けにはWindows Updateで提供され、単独のKBでも入手出来る。 (これがどういったものなのかは、7のペイントやワードパッドで確認出来る)
Officeのリボンと決定的に違うのは、マークアップバイナリをリソースに持たせる点だろう。 さて、リソースの話をしたが、通常自前のexeならexe側に持たせる事もよくあるが、 Officeではそれは妥当と言えないだろう。
なので、DLLに持たせるのだが、お分かりだろうか。 開発側にはDLLを作成出来る環境、実行側にはDLLを持ち込める環境という条件である。
##1) TypeLib
まずは、DLL側のリソースに持たせるTypeLibに触れてみよう。 MSDNを参照してWindows SDK の該当する*.idlを VBA向けに直していく作業である。
特定のCOMインターフェースはそもそも未定義なので (著者は)アルファベット順に並んでいるメソッドに注意を払いつつ、 MSDNから逐一、各メソッドの定義をコピー、idl側の定義と置き換えた。 (根気の要る作業であるorz)
基本的に引数は値渡しのLong型として、必要に応じて 参照渡しの固有型等に変更すればいいだろう。
##2) DLL
別段、これと言った作業ではなくて、MSDNからエントリーポイント(DllMain)を コピーしてくるだけである。 (include文も必要)
##流れ
マークアップコンパイラ(uicc.exe)でribbonの定義ファイル(.xml)をマークアップバイナリ(.bml)へ。 (リソースファイルも同時)
IDLコンパイラ(midl.exe)でTypeLib作成。
リソースファイルにTypeLib追加の旨を書く。
リソースコンパイラ(rc.exe)で、リソーススクリプト作成。
VC++コンパイラ(cl.exe)でDLL作成。
##Excelでの例
リンク先の練習 2: リボンへのコントロールの追加 をExcelのUserFormに置き換えてのサンプル。
ExcelならUserFormに強力なUIを提供しますが、使いこなすのはなかなか、大変かなと。 (基本的に英語のドキュメントオンリーなので)
##リファレンス
##後書き TypeLibは、未定義なのは仕方無いとして、 正規表現のパターンをよく考えれば、効率良くidlを変更出来るかもしれません。
APIや定数もTypeLibに定義出来ますが、既にDeclare 用のスクリプトがあり、それを使い回しているので、 VBA側で宣言しています。
また、C++のサンプルをWH_CALLWNDPROCフック
などのフック用に直せば、見た目の上で同じ事が出来ますが、
VBAとの連携を考えると却って難しいかもしれません。