system32以外のフォルダにあるActiveXコンポーネントの登録をするとどうなるのか?


HTTP  2008-07-16 19:50:02  No: 100901  IP: 192.*.*.*

お世話になっています。

よくある質問かもしれませんが、OCXのバージョンに関することで困っています。
OCXのバージョンが最新のものではないという実行時エラーが出るため、その対策を考えています。

フリーソフトで、ランタイムを更新してくれるソフトがありますが、それを使うと、現在C:\WINDOWS\system32内にあるActiveXコンポーネントが上書きされてしまうと思います。
そこで、ランタイムを更新してくれるソフトを使わずにOCXのバージョンを変える方法を考えています。

C:\WINDOWS\system32にすでに登録されているActiveXコンポーネント(例えばCOMDLG32.OCX)があるとします。
このとき、他のフォルダに、バージョンの違う(C:\WINDOWS\system32にあるCOMDLG32.OCXよりも新しいバージョンのc:\test\COMDLG32.OCX)ActiveXコンポーネントがあるとして、VBのプログラム内で、
r=shell("regsvr32.exe c:\test\COMDLG32.OCX")
を実行すると、COMDLG32.OCXはどうなってしまうのでしょうか?

試しに行ってみましたが、C:\WINDOWS\system32内にあるCOMDLG32.OCXファイルは、そのまま変わりませんでした。また、今のところはおかしな動きはしていません。
VBは、どちらのバージョンのActiveXコンポーネントを使うのでしょうか?それとも、不具合を生じてしまうのでしょうか?

OCXのバージョンが最新のものではないという実行時エラーが出たときに、最良の対策は何なのでしょうか?

編集 削除
魔界の仮面弁士  2008-07-17 09:34:00  No: 100902  IP: 192.*.*.*

> 上書きされてしまうと思います。
OCX のバージョンアップであるならば、それは正しい動作だと思います。

ODX のバージョンダウンであるならば、問い合わせ無しの上書きは、
そのインストーラの手抜き(あるいはバグ)に当たります。


> そのまま変わりませんでした。
REGSVR32 によって、ファイルのコピー等が行われる事はありません。
レジストリへの登録が行われるのみです。


> VBは、どちらのバージョンのActiveXコンポーネントを使うのでしょうか?
それ以降にロードされる OCX は、regsvr32 されたパスの物が使われます。
これは、ActiveX コンポーネントのレジストリ登録では、同一のIDに対しては、
一つのファイルしか割り当てられないからです。

ただし、Side By Side 配置をおいては、異なるバージョンを切り替えて
利用する事ができます。SxS 配置の動作については、下記を参照してみてください。

[WinXP がもたらす VB デベロッパーへの福音 - 第 2 回]
http://www.microsoft.com/japan/msdn/thisweek/vbxp/vbxp2.aspx

[FIX: Windows side-by-side execution is not supported for Visual Basic 6.0 ActiveX controls]
http://support.microsoft.com/kb/828629/ja



> 不具合を生じてしまうのでしょうか?
ComDlg32.ocx であれば大丈夫だとは思いますが、それについては、
ocx の種類およびバージョンによるところが大きいかと思います。

たとえば、ocx のバージョンが上がる事によって、依存 DLL 数が増加する場合、
それらの依存 DLL / サテライト DLL が配置されていなかったとしたら、
OCX のみの更新作業は、何らかの動作不具合を招く可能性があるでしょう。


> OCXのバージョンが最新のものではないという実行時エラーが出たときに、最良の対策は何なのでしょうか?
配布用のインストーラを作ることです。正しく設計された VB 用のインストーラは、
VBP プロジェクトを参照して、適切なバージョンチェックを行ってくれるでしょう。

インストーラ側で検出されなかったファイルについては、自分で調査して
インストーラに組み込む必要があるでしょうが、自作したプロジェクトであれば、
どのようなコンポーネントを使用していて、開発環境ではどのバージョンを
使っていたのかを調べる事は、不可能では無いですよね。

編集 削除
HTTP  2008-07-17 20:10:06  No: 100903  IP: 192.*.*.*

ご回答ありがとうございます。

[FIX: Windows side-by-side execution is not supported for Visual Basic 6.0 ActiveX controls]
の読解が難しく、誤解があるかもしれませんが、
Windows side-by-side によって、バージョンの異なる複数のActiveXコンポーネントをコンピュータに存在させ、マニフェスト ファイルを使って、自分の好きなバージョンのActiveXコンポーネントをロードすることができる。と考えてよろしいのでしょうか?
例えば、プログラムの実行ファイルと同じフォルダにOCXファイルとマニフェスト ファイルを配置すれば、そのプログラムはそのフォルダのOCXファイルをロードするということでしょうか。

ただ、OCXファイルのバージョンによって、OCXファイルと依存関係にあるDLLファイルの数やバージョンも異なると思いますが、DLLファイルの配置や登録はどうするのでしょうか。
そこまで考えなくてもいいのでしょうか?

それとも、上記のことはまったく外れているのでしょうか?

編集 削除