VB6
DLLを参照しているEXEを複数作成あります。
そしてDLLのコンパイル バイナリー互換?!でコンパイルしています。
Public Enum ProgNum
Option1 = 11
Option2 = 12
End Enum
のようにしているのですが
Option1 = 15
Option3 = 12
のように変更すると
コンパイル時に互換の解除のメッセージがでてEXEが動かなくなります。
Option4 = 14
のように追加の場合、問題はありません。
わかる方教えてください。よろしくお願いします。
> バイナリー互換?!で
『?!』が付いているのが、微妙に気になります。(^^;
> Option1 = 15
そのような変更を行うと、旧バージョンと新バージョンで、
x = Option2 - Option1
の結果が異なってしまいますよね。
定数値や、クラス名/メソッド定義などに変更を加えると、
旧バージョンと新バージョンとで、互換性が失われてしまうので、
そのような警告が出てきます。
詳細については、ヘルプの方をご覧ください。
[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[コンポーネント ツール ガイド]
└[ActiveX コンポーネントの作成方法]
└[コンポーネントのデバッグ、テスト、配置]
└[ActiveX コンポーネントのバージョン間の互換性]
├[バージョン互換性をいつ使用するか]
├[バイナリ互換性の保持]
├[バイナリ バージョンの互換性のレベル]
├[バイナリ バージョン互換性を維持するための参照ポイントの指定]
└[バイナリ バージョン互換性の使用]
>そのような変更を行うと、旧バージョンと新バージョンで、
> x = Option2 - Option1
>の結果が異なってしまいますよね。
結果が変わっても問題ないのですが・・・・
プログラムの仕様変更で修正をしないといけない状態です。
VBで警告が出る以上どうにもならないのでしょうか?
よろしくお願いします。
これが列挙値ではなく、クラスメンバなどであれば、互換インターフェイスを
用意するなどの逃げ道もあったのですけれどね…。
> 結果が変わっても問題ないのですが・・・・
Mさんのプログラム(のロジック)には問題が無いかも知れませんが、
残念ながらCOM/ActiveXの世界では、その違いが大きな意味を持ってきます。
(互換性維持の件は、VBの仕様というよりも、COM/ActiveX側の制限なので…)
そもそも、後から仕様変更が多く入るのであれば、バイナリ互換にすると
破綻しやすかったりします。本来であれば、そうした変更が行われなく
なった時点で「バイナリ互換」にすべきという事で。
それでも、リリース後に非互換の仕様変更が入ってしまったようなときは、
仕方ないので、運用などで回避する事になってしまうのではないかと。
案1) 以前の列挙型は残すが、旧列挙型を使ったコードは全廃し、
かわりに、新列挙型を利用するようにする。
→ProgNum.Option1 ではなく、ProgNumber.Option1 にするとか。
案2) 毎回、互換性を解除する。すなわち、完全に別のコンポーネントと
みなして、バージョンアップのたびに利用側も再コンパイルする。
→悲しいことに、こういうプロジェクトをよく目にします…。
案3) 利用側で参照設定を行わない。VBScriptなどと同様、利用側は、
CreateObject で生成し、レイトバインド主体のコードで利用する。
→複数バージョンのExcelを操作する場合などによく利用される方法です。
丁寧なご説明ありがとうございました。
ツイート | ![]() |