外部PKG(BPL)のインターフェースを変更してもリコンパイルしない方法は?

解決


もんすけ  2014-11-13 21:30:43  No: 46875

環境:DelphiXE5、WIN32bit

外部パッケージ化されたBPLのインターフェース(interface)以外の箇所に変更を加えた場合、
参照元のEXEをリコンパイルをしなくても変更が反映されました。

外部パッケージ化されたBPLのインターフェース(interface)に変更を加えた場合、
正常に動作しなくなってしまいました。(本来のプロパティとは違うプロパティ値の値を参照していたり)

参照元のEXEをリコンパイルすると、正常に動作しました。(本来のプロパティ値の値を参照する事ができる)

500本弱のEXEでBPLを参照している為、
インターフェースに変更が加わる度に全EXEのリコンパイルは避けたいのですが
何か良い方法があればご教授下さい。


もらみとなのい  2014-11-14 01:23:42  No: 46876

考えるまでもないですが、そのような方法は存在しません。
変更された内容を参照元のEXEが知る方法は存在しないため、再コンパイルしない限り正常に動作しないのは当然です。

そもそも参照元が多いライブラリのインターフェースを何度も変えてしまうこと自体設計に問題があると思われます。
仕様が変わっても再コンパイルしないためには、変更の可能性がある部分はインターフェースに依存しないよう引数化してデータとして渡す等、設計を見直した方が良いのではないでしょうか。


もんすけ  2014-11-14 20:16:40  No: 46877

もらみとなのいさん
>変更の可能性がある部分はインターフェースに依存しないよう引数化してデータとして渡す等
ありがとうございます。設計の見直し…確かにその通りですね。
この件以外にも問題はあるので考えてみます。

下記のようなテスト用BPLを作成し、
参照元のEXEをコンパイル後に
「//*追加」の行を追加してテストをしてみました。

〜記〜

unit DM_sample;

interface

uses
  System.SysUtils, System.Classes;

type
  TDataModule1 = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
    private
      function gt_PUB_1():String;
      function gt_PUB_11():String;     //*追加
      function gt_PUB_2():String;
    public
//①変数を直接外部から参照  →F_PUB_2を参照すると、F_PUB_11の値が返される
      F_PUB_1:String;
      F_PUB_11:String;     //*追加
      F_PUB_2:String;
//②関数を外部から参照      →すべて正常な値が返される
      function Fnc_PUB_1():String;
      function Fnc_PUB_11():String;     //*追加
      function Fnc_PUB_2():String;
//③プロパティ値の読み込みに変数を指定    →①と同様
      Property Prp_PUB_1:String read F_PUB_1;
      Property Prp_PUB_11:String read F_PUB_11;     //*追加
      Property Prp_PUB_2:String read F_PUB_2;

//④プロパティ値の読み込みに関数を指定    →すべて正常な値が返される
      Property Prp2_PUB_1:String read gt_PUB_1;
      Property Prp2_PUB_11:String read gt_PUB_11;     //*追加
      Property Prp2_PUB_2:String read gt_PUB_2;
    published

//最下部に追加する分には問題なくプロパティ値が読み取れる
    private F_PUB_12:String;                  //*追加
    private function Fn_PUB_12():String;      //*追加
    public Property P1_PUB_11:String read F_PUB_12;  //*追加

  end;

〜中略〜
function TDataModule1.gt_PUB_1():String;
begin
  Result:= F_PUB_1;
end;
function TDataModule1.Fnc_PUB_1():String;
begin
  Result:= F_PUB_1;
end;

〜以下略〜

結果A.変数を直接参照①、プロパティ値の読み取り値に変数を指定した場合③は、不正な値が返されました。
結果B.変数の値を戻り値とする関数を参照②、プロパティ値の読み取り値に左記関数を指定した場合④は、正常な値が返されました。
結果C.各行の間に変数を追加せず、最下部に変数を追加した場合、その影響は無く、正常な値が返されました。

Aの方法を取りやめ、Bの方法に変更して、参照元のEXE(500本)をリコンパイルすれば、それ以降、変数を追加しても不都合は生じない…様なのですが、この方法を取った場合に起きうる問題は何かあるでしょうか


もんすけ  2014-12-09 19:37:26  No: 46878

>結果B.変数の値を戻り値とする関数を参照②、プロパティ値の読み取り値に左記関数を指定した場合④は、正常な値が返されました。

この対応で、プロパティ、関数、手続き、コンポーネントを追加しても、
リコンパイルせずに動作したのでこの方法を取る事にし、解決としたいと思います。
ありがとうございました


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

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






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