t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 参照設定とCreateObjectは全く別の経路でオブジェクトを参照する。

昨日以下の記事を書いた。
thom.hateblo.jp

要約すると、レジストリのHKEY_CLASSES_ROOT直下にプログラムID(InternetExplorer.Application等)のキーがあり、その下のCLSIDにGUIDが入っているのでそれをまたレジストリから辿ると、TypeLibを辿れるというもの。
f:id:t-hom:20160130160615p:plain

TypeLibまでたどれば参照設定名も分かるので、相互変換できると思い込んでいたのだが、結論としてこの方法が使えるのはIEなどごく一部のプログラムだけだった。

ためしにWordのCLSIDを辿ってみると、そこにTypeLibが無い。
f:id:t-hom:20160131040417p:plain

逆に、TypeLibから辿る方法も使えなかった。

なかなか良い方法だと思ったのに残念。

さて、ではVBAはどうやって参照設定とCreateObjectを対応づけているのかと思い、ProcessMonitorというツールを使ってレジストリファイルシステムの動きを観察してみた。(最初からそうしてれば良かった。反省。)

さて、CreateObjectでIEを起動するケースで、重要なイベントだけピックアップしてみた。
f:id:t-hom:20160131042001p:plain

HKCRというのはHKEY_CLASSES_ROOTの略である。

つまり、CreateObjectに渡されたプログラムIDでまずHKEY_CLASSES_ROOTからCLSIDを引っ張ってきて、そのキーを辿るところまでは予想通りだった。

その後、svchost.exeに処理がわたり、HKCR\CLSID\{GUID}\LocalServer32を参照する。
そのLocalServer32にパスが書かれていて、それをファイルシステムから参照し、IEを起動する。
という流れのようだ。

PowerPoint.Applicationでも試してみたが、大体同じ流れだった。
なぜか、LocalServer32はIEと違って(規定)ではなく、よくわからない暗号みたいな方を参照していたが。。
f:id:t-hom:20160131042839p:plain

参照設定を行った場合はTypeLibの情報からパスを読み込んでくるので、そもそも参照設定とCreateObjectでは全く別の経路でオブジェクトのバイナリを参照していることになる。

ということで、参照設定をCreateObjectに変換するには、地道にHKCRからそれらしい名前を見つけてくるしかなさそうだ。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。