• ベストアンサー

DLLとC/C++インターフェイス

WindowsのDLLを開発するとき、一般的にはC++よりもCのインターフェイスでエクスポートすることが多いですよね。 これにはなぜでしょうか? 思いつくのはCのインターフェイスでエクスポートしたほうが、LoadLibraryとGetProcAddressによる動的リンクがし易いという点がありますが、他に何かあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

簡単に言えば、C++インターフェースのDLLは(最悪の場合)同じコンパイラの同じバージョンでしか使えなくなるためです。 C言語の場合と違って、C++ではソースのコンパイル時に関数はその名前に対して複雑な変換を行ってからリンカに渡します。これをマングリングといいます(参考URL参照)。 問題は、このマングリングの方法は各コンパイラごとに違い、下手をすると同じコンパイラでもバージョンが違うと異なる場合があります。 したがって、外部からライブラリを参照する場合は同じマングリング方法をとっているコンパイラ(つまりライブラリ作成時のものと同じコンパイラ)を使う必要があります。 *以下、余談 実は以前私はGDI+をネイティブに使ったC++プログラムを作ったことがあります。 そのとき使ったGDI+ライブラリはクラスで提供されていて、しかもVC++でもBCCでも利用できるものでした。 そのことをあまり気にも留めていなかったのですが、あるとき上に書いたようなことを思い出し、 「はて、どうやってこの問題を解決しているんだろう?」と調べてみました。 すると、そこにあったのは…… ……そのままの状態では決して使うなとドキュメントされたCインターフェース関数群とそれをラップするC++クラスのヘッダーファイルでした。 まあ、こういう回避法もあるということで。

参考URL:
http://www.kijineko.co.jp/tech/cppemb/mangling.html
tsuruharu
質問者

お礼

ありがとうございました。