tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルユーザーコントロールの更新について
記事No16189
投稿日: 2015/10/01(Thu) 16:36
投稿者かなやん
○○.ocxというユーザーコントロールを作成しまして
様々なプログラム(EXE)で使用しています。
この○○.ocxを修正したとき、
各プログラムもコンパイルし直さないといけませんか?

○○.ocxだけ更新してEXEはそのままだと
エラーになってしまいます。
エラーメッセージは「予期せぬエラーが・・」や
「実行時エラー」など場合によって様々です。

VB5.5、XP

○○.ocxを更新したら自然に新しい○○.ocxをつかってくれるような
設定やコンパイルの仕方があれば教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: ユーザーコントロールの更新について
記事No16190
投稿日: 2015/10/02(Fri) 12:05
投稿者魔界の仮面弁士
> ○○.ocxというユーザーコントロールを作成しまして
> 様々なプログラム(EXE)で使用しています。

別 exe から共有利用しているのであれば、ocx として分離した以上、
当然「互換性」が重要となります。

Project1.exe 内にある UserControl1 を、Project1 内の Form1 で使う分には、
外部共有されていないため、どのような修正を行っても互換性の問題は無いですけれどね。


> この○○.ocxを修正したとき、
> 各プログラムもコンパイルし直さないといけませんか?

コンパイルせずに済む方法もあります。
最重要なのは、プロジェクトのプロパティの[コンポーネント]タブにある
『バージョン間の互換性』設定ですね。


・実行環境には最新版だけおいておけば良いですが、開発環境では
 互換性管理のため、旧バージョンの ocx も必要になります。
 誤って削除したり上書きしたりしないよう、別フォルダに
 退避させたりバージョン番号入りのocxを作っておくなどして、
 きちんと管理しておきましょう。

・バイナリ互換性を維持させている場合は、ocx を修正しても
 exe 側はリコンパイルせずに使えます。
 https://support.microsoft.com/ja-jp/kb/161137

・バイナリ互換性が無い場合、同名別バージョンの ocx を
 side-by-side 配置とすることで対応する手もあります。
 https://msdn.microsoft.com/ja-jp/library/cc482775.aspx

・互換性が無い場合には、利用している exe 側の再コンパイルが必要です。

・外部コンポーネントを利用している場合には、自身の互換性だけでなく、
 依存コンポーネント側のバイナリ互換性の有無についても確認しておいてください。

 ・Comctl32.ocx の特定バージョンにおいて、バイナリ互換性が失われてしまい、
  その後、改めて互換性のあるバージョンが追加リリースされたことがあります。
  https://support.microsoft.com/ja-jp/kb/167123

 ・ADODB のオブジェクトを受け渡す必要がある場合、異なるバージョンからも
  呼び出せるようにするために、互換インターフェイスでの宣言に
  切り替える必要が生じるケースがあります。
  https://support.microsoft.com/ja-jp/kb/195049

 ・Excel コンポーネントを参照設定している場合、一部のメソッドで
  互換性が失われています。具定例は過去ログに幾つかあったはず。

・ocx のバージョンを上げる場合、プロジェクトのプロパティで
 バージョン番号を更新することもお忘れなく。



コンパイル設定ではなく実装に関して言えば、たとえば Public Function なら
下記のような感じです。プロパティやイベントも基本的には同じですね。

 ・既存のプロシージャを削除するのは、当然 NG です(旧プログラムが動かなくなります)。

 ・既存のプロシージャの処理内容を変更するのは OK です。

 ・新しいプロシージャを追加するのも OK です。

   ・ただし、そのクラスを他のクラスで Implements している場合、
    メソッド名の競合が無いようにする必要があります。
    (メソッド名に「_」をつけなければ問題は無いはず)

 ・「メソッド名」「引数の数」「引数の型」「戻り値の型」を変えるのは NG です。

   ・省略可能な引数を追加するのも NG です(レイトバインドなら呼べますが、アーリーバインドでは非互換)

 ・「引数名」を変えるのも、基本的に NG です("名前付き引数"での呼び出しに影響があります)。


また、[ツール]-[プロシージャ属性]で、プロシージャID を利用している場合は、
そちらも確認しておきましょう。


UserControl そのものについていえば、追加でこんなところ。

・UserControl の上に貼るコントロールは、追加・削除等の修正を行っても問題ない。

 ・ただし、[参照設定]や[コンポーネント]の追加を行う場合には注意が必要。

 ・LinkTopic/LinkItem プロパティのように、外部連携を伴う機能にも注意。

・モジュール変数の変更・削除も NG。

 ・ただし Private なメンバーなら問題ないはず。

・Implements ステートメントを利用している場合、Implements する相手を変更するのは NG。

 ・Implements 対象が同じでも、相手が互換性を失っている場合は NG。



> VB5.5、XP
・Visual Basic に 5.5 というバージョンはありません。(VBScript 5.5 ならありますが)

・VB5 の開発環境(≠実行環境)は、XP での動作を保証していません。(98までです)
 http://www.microsoft.com/ja-jp/dev/support/tools_archive.aspx

・先に書いた side-by-side は、VB6(SP6)+XP(SP2/SP3) の話です。(VB5 では利用できないかも)
 https://support.microsoft.com/en-us/kb/828629


> 設定やコンパイルの仕方があれば教えてください。
コンパイルオプションの「プロジェクト互換」「バイナリ互換」「互換なし」の
違いは分かりますか? (VB5 付属の Books Online で確認してみて下さい)

[ツリー表示へ]
タイトルRe^2: ユーザーコントロールの更新について
記事No16191
投稿日: 2015/10/02(Fri) 15:09
投稿者かなやん
魔界の仮面弁士 様

ありがとうございました!
バイナリ互換についてイマイチ理解できてなかったのですが
わかりやすい説明のおかげで、理解することができました!

まだまだ勉強していきます。

本当にありがとうございました!!!

[ツリー表示へ]