お世話になっています。
よくある質問かもしれませんが、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のバージョンが最新のものではないという実行時エラーが出たときに、最良の対策は何なのでしょうか?
> 上書きされてしまうと思います。
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 プロジェクトを参照して、適切なバージョンチェックを行ってくれるでしょう。
インストーラ側で検出されなかったファイルについては、自分で調査して
インストーラに組み込む必要があるでしょうが、自作したプロジェクトであれば、
どのようなコンポーネントを使用していて、開発環境ではどのバージョンを
使っていたのかを調べる事は、不可能では無いですよね。
ご回答ありがとうございます。
[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ファイルの配置や登録はどうするのでしょうか。
そこまで考えなくてもいいのでしょうか?
それとも、上記のことはまったく外れているのでしょうか?