あなたにとってメリットがビルドしかないならそうでしょう。
LoadRibrary使う可能性あるならクラスのエクスポートが使えないから選択の余地なし
皆さんは、なぜそこまで亀山さんが、ビルドをしないのにこだわっている理由が
分からないみたいです。
僕も分からないですね。
ただ、両方ビルドをするのが大変だからという理由だけではないみたいですね。
その理由がわかるとより適切なアドバイスが出来ると思います。
あさんも書かれていますけれど、
プラグインのような物であれば、実行ファイル側はリビルド不要になります。
ただし、実行ファイル側が知らないインターフェイスは実行ファイル側からは
見えませんし、使えません。既存のインターフェイスを変える事は許されません。
変えない事を条件にした設計になりますからね。
リリース済みの実行ファイルからは使えないけれど、
そのインターフェイスに合わせた実行ファイルからは見えるし使えると言う話なら
ありえますね。
なんにしてもライブラリ側が全く影響を受けないのは、
インターフェイスに変化がなく、DLL側の挙動の変化が実行フィル側に影響ない場合
だけの話なので、大幅な改修の場合は実行ファイル側のビルド無しにと言うのは
ちょっと難しいと思います。インターフェイスは設計済みで実装が後になっている
というケースならありえるかもしれませんけれど、実行ファイル側が全く新しい
インターフェイスを利用する為には、実行ファイル側の改修が必要になりますからね。
あさん、ITOさん、PATIOさん、ご意見ありがとうございます。
プラグインの仕組みについては、それなりに理解しているつもりです。
この手のものは、クラスではなく
DEFファイルを使うような通常の関数群になっていて、
そのためDLL側にインターフェイス(関数)を増やしても
過去の関数に手を加えない限りはEXE側のリビルドは不要なのですよね。
こういう仕組みをクラスにも使えないのかなと思っていたときに、
純粋仮想関数を使ったクラスのエクスポートに関する内容を読んだため、
これならできるのかなと思って質問させていただきました。
クラスは基本的にインターフェイス(メンバ関数)を増やしたときにも
リビルドが必要になるということで理解しました。
ありがとうございます。
> 過去の関数に手を加えない限りはEXE側のリビルドは不要なのですよね。
クラスでも「過去のクラスに手を加えない限り」Exe側のリビルド不要となれば、
単純に、粒度を関数個別からクラスという単位に変更しているのですから、
関数レベルで過去の関数に手を加えない場合の影響範囲と比較して、
格段にひどくなったという印象は(私には)ありません。
関数レベルで引数を追加したときにリビルドが必要なのと大差ないというか…。
実際、
> クラスをエクスポートという時点でEXEをVCで作る縛りになる。
ですし、またVC間でも、inlnine展開されたSTLクラスの設定/バージョンが
合わないだけで互換性ないですし…。
ABI意識して汎用性にこだわるなら__declspecはナイと思います。
> こういう仕組みをクラスにも使えないのかなと思っていたときに、
> 純粋仮想関数を使ったクラスのエクスポートに関する内容を読んだため、
> これならできるのかなと思って質問させていただきました。
既述ですが、COMの考え方は「こういう仕組み」をクラスにまで拡張してると思います。
制限もありますが、ああいう形へと向かうのは一案でしょうか。
・「過去の関数に手を加えない」⇒
・過去のクラスに手を加えない⇒
・別インタフェースとして公開する
# 個人的には、クラスにしない方が大抵お手軽だと思いますが。
そもそも、クライアント側に(コードレベルで)埋め込まれたクラスの構成まで
影響を受けるような追加を、DLL側だけでやろうというのは無茶な話。
vtblのサイズが変わったクラスのバイナリから変わる前のバイナリを参照したり
することになると、関数レベルで引数の数や型を変えて互換性を維持するような
芸当と大差ない理解です。一般論では、そうならない範囲でしか切り替えられない。
Banさん、ご意見ありがとうございます。
> 関数レベルで引数を追加したときにリビルドが必要なのと大差ないというか…。
たしかに昔、引数を追加したばかりに、
リビルドし忘れたEXEに影響が及んで正しく動かなかったことがあります。
今回はソリューションをしっかり構成し、
EXE側のリビルドし忘れが起きないようにした状態で、
クラスをそのままエクスポートするようにしようと思います。
# 恥ずかしながら、以前他部署から引き継いだ開発環境が、
# 同じフォルダに置かれるEXEやDLL一つ一つが別ソリューションになっていて、
# そのくせ一つのDLLをいろんなEXEがリンクして、
# このような問題が特にクラスDLLで多発したことがありました。
COMについても、勉強させていただきます。
ありがとうございます。