昨日以下の記事を書いた。
thom.hateblo.jp
要約すると、レジストリのHKEY_CLASSES_ROOT直下にプログラムID(InternetExplorer.Application等)のキーがあり、その下のCLSIDにGUIDが入っているのでそれをまたレジストリから辿ると、TypeLibを辿れるというもの。
TypeLibまでたどれば参照設定名も分かるので、相互変換できると思い込んでいたのだが、結論としてこの方法が使えるのはIEなどごく一部のプログラムだけだった。
ためしにWordのCLSIDを辿ってみると、そこにTypeLibが無い。
逆に、TypeLibから辿る方法も使えなかった。
なかなか良い方法だと思ったのに残念。
さて、ではVBAはどうやって参照設定とCreateObjectを対応づけているのかと思い、ProcessMonitorというツールを使ってレジストリとファイルシステムの動きを観察してみた。(最初からそうしてれば良かった。反省。)
さて、CreateObjectでIEを起動するケースで、重要なイベントだけピックアップしてみた。
HKCRというのはHKEY_CLASSES_ROOTの略である。
つまり、CreateObjectに渡されたプログラムIDでまずHKEY_CLASSES_ROOTからCLSIDを引っ張ってきて、そのキーを辿るところまでは予想通りだった。
その後、svchost.exeに処理がわたり、HKCR\CLSID\{GUID}\LocalServer32を参照する。
そのLocalServer32にパスが書かれていて、それをファイルシステムから参照し、IEを起動する。
という流れのようだ。
PowerPoint.Applicationでも試してみたが、大体同じ流れだった。
なぜか、LocalServer32はIEと違って(規定)ではなく、よくわからない暗号みたいな方を参照していたが。。
参照設定を行った場合はTypeLibの情報からパスを読み込んでくるので、そもそも参照設定とCreateObjectでは全く別の経路でオブジェクトのバイナリを参照していることになる。
ということで、参照設定をCreateObjectに変換するには、地道にHKCRからそれらしい名前を見つけてくるしかなさそうだ。