読者です 読者をやめる 読者になる 読者になる

dllの作り方

先程dllとlibについての話を簡単に書きました。 そこでdllについてもう少し理解を深めるために、作り方を通して勉強していこうと思います。

何を作るのがゴールになるのか
最終的なゴールは次の3つを作成することになります。
| 拡張子 | 説明 | | :—: | :—: | | dll | 実行時に呼び出されるDLLライブラリ | | lib | コンパイル時に使用するライブラリ | | h | DLLのヘッダファイル |

普通の関数は、プログラム本体の一部として組み込まれているが、DLLは関数だけがコンパイルされて、dllという拡張しの別ファイルになっている。
プログラムの実行時にロードされ、あとは普通の関数と同じように実行される。
DLLだけだと、コンパイル次にどのようなインターフェースになっているかわからないので、これ以外に

  • Cのプロトタイプを記述したヘッダファイル
  • DLLのコンパイル時に、コンパイラが出力するDLLの入出力情報が記述されたlibファイルが使われる。

呼び出し側のプログラムは、DLLのヘッダファイルをインクルードして、普通の関数と同様に呼び出す。

DLLのリンクは、DLLのインターフェースを記述してlibファイルを指定して、コンパイラにリンクを任すようにする。

コンパイラは実行時にDLLをロードして実行するようにコンパイルする。

作り方

  1. Visual Studio で[ファイル]->[新規作成]->[プロジェクト]で新しいプロジェクトを作成

f:id:takahiro-itazuri:20170328213252p:plain

  1. Visual C++ で[空のプロジェクト]を選択し、名前には自分の作りたいDLLファイルの名前を入れる。

f:id:takahiro-itazuri:20170328213459p:plain

  1. hppファイルとcppファイルを作成

f:id:takahiro-itazuri:20170328214053p:plain

  1. hppファイルに次のように書く

f:id:takahiro-itazuri:20170328215002p:plain

  1. ソリューションエクスプローラ内のプロジェクトを右クリックし、[プロパティ]を選択。

f:id:takahiro-itazuri:20170328213759p:plain

  1. [全般]->[構成の種類]->[ダイナミックライブラリ(.dll)]を選択。ただし、構成とプラットフォームは自分の環境に合わせる

f:id:takahiro-itazuri:20170328213931p:plain

  1. [C/C++]->[プリプロセッサ]->[プリプロセッサの定義]に先程hppで書いたifdef文の部分を書き入れる

f:id:takahiro-itazuri:20170328215151p:plain

  1. 変更を[適用]する。すると、hppで書いたifdef文がdefineされたことになり、色が変わる。

f:id:takahiro-itazuri:20170328215417p:plain

  1. あとはdllにしたい関数を実装していく。

プロトタイプはhppに実装し、関数の中身はcppに実装する。 ただし、プロトタイプの頭にdefineした部分を書く

f:id:takahiro-itazuri:20170328220617p:plain