こんにちは。初歩的な質問で申し訳ありませんがご教授願います。
VC++6.0(SP5)で開発しています。(ターゲットOSはWindows2000、2003)
DLLにユーティリティクラスが定義してあり、
そのクラスをDLLをリンクするEXEで使用しています。
DLLに次のいずれかの変更があった場合
EXEのほうはリビルドすべきでしょうか?
(1)DLLのヘッダに変更はないが、cppファイルの実装のほうに変更があった
(2)DLLが提供するクラスにメンバ関数を1つ追加したため、
ヘッダとcppの実装に変更があった
(3)DLLが提供するクラスに新規メンバとメンバ関数を追加したため、
ヘッダファイルとcppの実装に変更があった
(1)はEXEのリビルドは必要ないと思いますが、
(2)と(3)はどうでしょうか?
よろしくお願いします。
DLLのExport/Importインターフェイス(関数名だとか引数だとか)に
修正が無ければ利用する側はリビルドする必要なし。
#一度、Export関数の引数が知らぬ間に減らされていたが
#ソレに気付くまで、まったく正常に動作していた事は今でも謎です。
回答ありがとうございます。
ただ、DLLの中で実装されたクラス自体をExportしている場合は、
クラスにメンバ変数を新たに追加するとリビルドが必要になりませんか?
関数だとExport/Importに修正がなければ~というお話は理解できるのですが、
クラス定義の場合はどうなのかなと。
今頃すみませんが、実はこのようなケースでDLLが公開するクラスを変更したところ、
DLLをリンクするEXEのほうが落ちまくってしまい、
そもそもクラスの実装がまずいのか、それともこういうケースはEXEのリビルドが
必要なのかを確認したかったのです。
DLLのクラスに追加した処理としては、privateメンバに
std::map<std::string, std::map<std::string, std::string> >
クラスオブジェクトを追加して、このメンバにアクセスするpublicメンバ関数を
追加しました。
俺ならインターフェースだな。
メンバ変数が増えたらサイズ変わるし
コンストラクタの処理も増えるし
EXEが古いままだったらとうぜんNG
◆EXE
//使うとき。
IA * a = createA();
a->func1();
//もう必要なくなったとき。
a->delete();
◆DLL
IAは純粋仮想関数のみ。
IAを変更するならEXEも作り直しになる。
実際にはIAの派生クラスを実装する。
EXEはIAの仮想関数呼び出ししかしないので余計なものに影響せず。
クラスのそのままエクスポートは楽だけど
長期使えるものではないDLLになるから俺は使わない。
好みの問題だけど長期使わないDLLであっても俺は避ける。
利用者に見せる必要のないprivateメンバも丸見えだし
コンストラクタとデストラクタとメンバに変更あるたびに配布しなきゃならんし
DLLとEXEでnew,deleteの実装が・・・
>コンストラクタとデストラクタとメンバに変更あるたびに配布しなきゃならんし
本当は変更したDLLだけ配布したくても
privateメンバも丸見えのヘッダファイルも再度配布しなきゃならんし
コンストラクタとデストラクタの変更では配布する必要ないか。
俺はクラスのエクスポートしてないもんでよくわかってないや。
自分でdefファイルを書いてエクスポートの順番をきちんと制御していない場合は
メンバー関数を追加しただけでも影響が出る事があります。
__declspec( dllexport )に頼ってエクスポートしていると
ビルド時に勝手に順番を決めてエクスポートされてしまうみたいなので
状況によっては実行ファイル側が呼び出している関数と一致しない場合が
あるみたいです。
__declspec( dllexport )を使っている場合は実行ファイル側もビルドした方が
無難かなと言う気もします。
上記のうまく行かなくなると言うのは確実にそうなると言う意味ではなくて
ビルド時に自動的にエクスポートされる時の順番をどう決めているのかが
私には分からないのでうまく行く場合と行かない場合の切り分けができていないだけ
と言う話です。
ちゃんと理解してやっている分には問題ないと思うのですが、
そこまで分析してません。
__declspec( dllexport )を使ってExportしています。
今回EXE側もリビルドしたところ(今のところ)問題なくなったので
EXE側もリビルドすることにしました。
みなさん回答ありがとうございました。