VB6からExeclを呼出すとき、CLSIDは各バージョンで同じか?

VB6アプリを再ビルドしたいと相談があり調べました。ExeclをVB6から操作するとき、COMコンポーネント( Windows上で世界でユニークなオブジェクトを示すID:CLSIDとそのインターフェイスをレジストリに登録することで呼出すソフトウェアコンポーネント) として Execl.exe を登録して呼出すようです。※イマドキではもっと簡単に Python でも可能なようです。

Dim execlApp   As Excel.Application 
Dim execlBook As Excel.Workbook 
Dim execlSheet As Excel.Worksheet

Set execlApp = CreateObject("Excel.Application")


これをBuildする場合、Execlの本体が必要なようです。Execlはバージョン毎に収録先が異なります。Execl2024の場合、設定は以下のようになります。

紐づけられるCOMコンポーネントはバージョンが明示されています。.VBP をみると、

CLSID00020430-0000-0000-C000-000000000046 のようです。内部バージョンは 2.0

アプリが複数のWindows PCで実行されると、そのPC毎に Execl の格納先とバージョンは異なるハズです。通常この設定を行うと、アプリ実行時、このパス固定参照されるか、レジストリ上に登録されている同じコンポーネントが呼び出されます。EXECLバージョン毎にCLSIDは同じなのでしょうか? .VBP で管理されるライブラリバージョンが一致しなくても動作するのでしょうか?


オリジナルの参照設定と .VBP をみると、Execl 2007 (内部version12)でした。CLSIDは同じですが、内部バージョンは1.6 でした。


試しに Execl 2003(内部version11) を設定してみた結果です。CLSIDは同じ、内部バージョンは1.5


以下動作結果です。

PCBuild時のExecl設定呼出されたExecl
Win11 Execl2003 & 2024同居20032024
Win11 Execl2003 & 2024同居20072024
Win11 Execl2003 & 2024同居20242024
Win11 Execl2003のみ20032003
Win11 Execl2003のみ20072003
Win11 Execl2003のみ20242003

動作原理をまとめると、

  • CLSIDの一致はみるが、バージョンは照合しない。
  • 上位互換性はあり。
  • 複数Execlがインストールされている場合は、新しいExeclの方が呼び出される。
  • VB6 IDE用のExeclバージョンは問われない。

ただし、新しいExeclで追加されたオブジェクト、methodは使えないのでしょうから、開発時のExeclに近いバージョンを使った方が無難と思います。( methodインターフェイスがかわるとmethodのCLSIDが変わるが、VBAオブジェクトヘルプにもmethod毎に対応バージョンまでは明記されておらず、それらを全部調べるのは現実的ではないため )

しかしながら、.NETアプリでありながら、COMコンポーネントあわせもつEXEを作れるんですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です