DLLについて

解決


M  2006-06-08 01:49:49  No: 131766

VB6  
DLLを参照しているEXEを複数作成あります。
そしてDLLのコンパイル  バイナリー互換?!でコンパイルしています。

Public Enum ProgNum
    Option1 = 11
    Option2 = 12
End Enum

のようにしているのですが

Option1 = 15
Option3 = 12

のように変更すると
コンパイル時に互換の解除のメッセージがでてEXEが動かなくなります。

Option4 = 14

のように追加の場合、問題はありません。

わかる方教えてください。よろしくお願いします。


魔界の仮面弁士  2006-06-08 03:19:52  No: 131767

> バイナリー互換?!で
『?!』が付いているのが、微妙に気になります。(^^;

> Option1 = 15
そのような変更を行うと、旧バージョンと新バージョンで、
  x = Option2 - Option1
の結果が異なってしまいますよね。

定数値や、クラス名/メソッド定義などに変更を加えると、
旧バージョンと新バージョンとで、互換性が失われてしまうので、
そのような警告が出てきます。

詳細については、ヘルプの方をご覧ください。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
  └[コンポーネント ツール ガイド]
    └[ActiveX コンポーネントの作成方法]
      └[コンポーネントのデバッグ、テスト、配置]
        └[ActiveX コンポーネントのバージョン間の互換性]
          ├[バージョン互換性をいつ使用するか]
          ├[バイナリ互換性の保持]
          ├[バイナリ バージョンの互換性のレベル]
          ├[バイナリ バージョン互換性を維持するための参照ポイントの指定]
          └[バイナリ バージョン互換性の使用]


M  2006-06-08 03:47:00  No: 131768

>そのような変更を行うと、旧バージョンと新バージョンで、
>  x = Option2 - Option1
>の結果が異なってしまいますよね。
結果が変わっても問題ないのですが・・・・

プログラムの仕様変更で修正をしないといけない状態です。

VBで警告が出る以上どうにもならないのでしょうか?

よろしくお願いします。


魔界の仮面弁士  2006-06-08 04:20:41  No: 131769

これが列挙値ではなく、クラスメンバなどであれば、互換インターフェイスを
用意するなどの逃げ道もあったのですけれどね…。

> 結果が変わっても問題ないのですが・・・・
Mさんのプログラム(のロジック)には問題が無いかも知れませんが、
残念ながらCOM/ActiveXの世界では、その違いが大きな意味を持ってきます。
(互換性維持の件は、VBの仕様というよりも、COM/ActiveX側の制限なので…)

そもそも、後から仕様変更が多く入るのであれば、バイナリ互換にすると
破綻しやすかったりします。本来であれば、そうした変更が行われなく
なった時点で「バイナリ互換」にすべきという事で。

それでも、リリース後に非互換の仕様変更が入ってしまったようなときは、
仕方ないので、運用などで回避する事になってしまうのではないかと。

  案1) 以前の列挙型は残すが、旧列挙型を使ったコードは全廃し、
    かわりに、新列挙型を利用するようにする。
  →ProgNum.Option1 ではなく、ProgNumber.Option1 にするとか。

  案2) 毎回、互換性を解除する。すなわち、完全に別のコンポーネントと
    みなして、バージョンアップのたびに利用側も再コンパイルする。
  →悲しいことに、こういうプロジェクトをよく目にします…。

  案3) 利用側で参照設定を行わない。VBScriptなどと同様、利用側は、
    CreateObject で生成し、レイトバインド主体のコードで利用する。
  →複数バージョンのExcelを操作する場合などによく利用される方法です。


M  2006-06-09 18:54:47  No: 131770

丁寧なご説明ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加