一昨日書いたクラスを丸ごとDLL化する方法。これは暗黙的リンクのときは楽に扱えます。しかし、明示的リンクを使用すると少し厄介です。まあ、今日ちょっと思いついたことやってみたらできたんで、分かってしまえばそうではないのかも知れません。ただ、これがMFCとかC++の作法に合っているのかが気になりますが…。新しい言語を覚えるときって、その言語特有の作法が気になるんですよ。その作法に合わせないと他の人が見たときの可読性が悪くなりますからね。

さて、いきなり「暗黙的リンク」とか「明示的リンク」とか書いていますので、なんのこっちゃと思い方もおられるでしょう。ですので、明示的リンクによるDLLにエクスポートしたクラスの利用方法を紹介する前に、これらの言葉についてわんちゅうの感覚で説明しようと思います。

わんちゅうの感覚的に、両者の違いは次のようになります。

暗黙的リンク
  • プロジェクトにインポートライブラリ(libファイル)を登録しなくてはならない
  • 対応するDLLファイルがないとプログラムが起動しない
  • プログラミング上、DLLであることを意識せずに関数を利用できる
明示的リンク
  • プロジェクトにインポートライブラリを登録しなくてよい(むしろしない)
  • 対応するDLLファイルが無くてもプログラムは起動する(動くようにプログラムされている場合)
  • プログラミング上、DLLのハンドラを取得したり、利用する関数に応じたポインタ変数を用意したり、その関数アドレスを取得したり、関数に応じてその戻り値をキャストしたり、DLLが見つからない時の処理も入れなくてはならないとコード上かなり面倒


最後はなんかグチのようになっていますが、こんな違いがあります。

プログラミングのし易さは断然暗黙的リンクの方が楽です。なので、明示的リンクを利用するメリットがないのでは? と思われると思います。しかし、世の中のプラグインというもの、要は「プログラムのリビルドなしに機能を拡張する」場合は明示的リンクが用いられているようです。
まあ、明示的リンクでのクラス利用方法についてはまた今度ということで…。

ところで、暗黙的リンクと明示的リンクの言葉の由来ですが、これはプログラマ視点で見ているそうです。前述の通り、明示的リンクではDLLを初めて呼ぶ位置をプログラマが把握できていますが、暗黙的リンクではどのタイミングでDLLを初めて呼んでいるか把握できないためにこのような呼び名になっているようです。
わんちゅう的には、あらかじめDLL内の関数が分かっているほうが「明示的」だと思うんですが、どうやら世間一般とわんちゅうの感覚は違うようです( ̄~ ̄)