環境:DelphiXE5、WIN32bit
外部パッケージ化されたBPLのインターフェース(interface)以外の箇所に変更を加えた場合、
参照元のEXEをリコンパイルをしなくても変更が反映されました。
外部パッケージ化されたBPLのインターフェース(interface)に変更を加えた場合、
正常に動作しなくなってしまいました。(本来のプロパティとは違うプロパティ値の値を参照していたり)
参照元のEXEをリコンパイルすると、正常に動作しました。(本来のプロパティ値の値を参照する事ができる)
500本弱のEXEでBPLを参照している為、
インターフェースに変更が加わる度に全EXEのリコンパイルは避けたいのですが
何か良い方法があればご教授下さい。
考えるまでもないですが、そのような方法は存在しません。
変更された内容を参照元のEXEが知る方法は存在しないため、再コンパイルしない限り正常に動作しないのは当然です。
そもそも参照元が多いライブラリのインターフェースを何度も変えてしまうこと自体設計に問題があると思われます。
仕様が変わっても再コンパイルしないためには、変更の可能性がある部分はインターフェースに依存しないよう引数化してデータとして渡す等、設計を見直した方が良いのではないでしょうか。
もらみとなのいさん
>変更の可能性がある部分はインターフェースに依存しないよう引数化してデータとして渡す等
ありがとうございます。設計の見直し…確かにその通りですね。
この件以外にも問題はあるので考えてみます。
下記のようなテスト用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本)をリコンパイルすれば、それ以降、変数を追加しても不都合は生じない…様なのですが、この方法を取った場合に起きうる問題は何かあるでしょうか
>結果B.変数の値を戻り値とする関数を参照②、プロパティ値の読み取り値に左記関数を指定した場合④は、正常な値が返されました。
この対応で、プロパティ、関数、手続き、コンポーネントを追加しても、
リコンパイルせずに動作したのでこの方法を取る事にし、解決としたいと思います。
ありがとうございました
ツイート | ![]() |