13,002
回編集
編集の要約なし |
編集の要約なし |
||
198行目: | 198行目: | ||
これは、/DYNAMICBASEオプションを指定することと同じことである。<br> | これは、/DYNAMICBASEオプションを指定することと同じことである。<br> | ||
または、ソースコード内において、#pragmaディレクティブで指定する。<br> | または、ソースコード内において、#pragmaディレクティブで指定する。<br> | ||
<br><br> | <br><br> | ||
== DLLの暗黙的リンクと明示的リンクの違い == | == DLLの暗黙的リンクと明示的リンクの違い == | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | style="background-color:#fefefe;" | ||
|- | |- | ||
! ! | ! style="background-color:#66CCFF;" | | ||
! style="background-color:#66CCFF;" | 暗黙的(静的)リンク | |||
! style="background-color:#66CCFF;" | 明示的(動的)リンク | |||
|- | |- | ||
| 関数の宣言 || DLLの関数に__declspecl(dllimport)を付けて宣言する。 || DLLの関数を宣言せず、typedefする。 | | 関数の宣言 || DLLの関数に__declspecl(dllimport)を付けて宣言する。 || DLLの関数を宣言せず、typedefする。 | ||
|- | |- | ||
| | | リンカ || リンカでライブラリファイルをリンクする必要がある。 || リンカでのリンクは不要である。 | ||
|- | |- | ||
| DLLの読み込み || EXEの実行の準備段階でDLLを読み込む。<br>DLLが見つからない場合、EXEは実行されない。 || LoadLibrary | | DLLの読み込み || EXEの実行の準備段階でDLLを読み込む。<br>DLLが見つからない場合、EXEは実行されない。 || <code>LoadLibrary</code>関数でDLLを読み込む。<br>DLLが見つからない場合、NULLが返る。<br>DLL内の関数を実行するには、<code>GetProcAddress</code>関数で関数アドレスを取得する必要がある。 | ||
|- | |- | ||
| 関数との紐付け || ライブラリファイルで、DLL内の関数名(序数も含む)が保持されている。<br>この関数名(あるいは序数)が一致しないとNULLが返る。 || GetProcAddress | | 関数との紐付け || ライブラリファイルで、DLL内の関数名(序数も含む)が保持されている。<br>この関数名(あるいは序数)が一致しないとNULLが返る。 || <code>GetProcAddress</code>関数で、DLL内の関数名(あるいは序数)を指定する。<br>この関数名(または序数)が一致しないとNULLが返る。 | ||
|- | |- | ||
| 暗黙的 / 明示的とは || EXEの実行準備段階でDLLを自動で読み込むので、暗黙的という。 || | | 暗黙的 / 明示的とは || EXEの実行準備段階でDLLを自動で読み込むので、暗黙的という。 || 設計者が<code>LoadLibrary</code>関数を使用してDLLを呼び出すので、明示的という。 | ||
|- | |- | ||
| 静的 / 動的とは || | | 静的 / 動的とは || リンカでリンクした時点で使用するDLLの種類や関数が決まるので、静的という。 || <code>LoadLibrary</code>関数と<code>GetProcAddress</code>関数を使用してDLL内の関数を自由に使用できるので、動的という。 | ||
|} | |} | ||
</center> | </center> | ||
<br><br> | <br><br> | ||
== | == DLLの暗黙的リンク == | ||
EXEファイルのプロジェクトに、DLLファイルを暗黙的リンクする方法を記載する。<br> | |||
<br> | <br> | ||
以下の例では、CppEXE.exeとCppDLL.dllが存在するものとして設定している。<br> | |||
# まず、CppEXE.exeのプロジェクトを起動する。 | |||
# [プロジェクト]メニュー - [CppEXEのプロパティ] - [構成プロパティ] - [C/C++] - [全般] - [追加のインクルードディレクトリ]項目に、<br>CppDLL.dllのヘッダファイル(CppDLL.h)が存在するディレクトリを追加する。 | |||
# 次に、[構成プロパティ] - [リンカー] - [全般] - [追加のライブラリディレクトリ]項目に、<br>DLLのライブラリファイル(CppDLL.lib)が存在するディレクトリを追加する。 | |||
# 最後に、[構成プロパティ] - [リンカー] - [入力] - [追加の依存ファイル]項目に、CppDLL.libと記述する。 | |||
<br><br> | |||
== DLLの明示的リンク == | |||
DLLの明示的リンクを行う場合、Windows APIの<code>LoadLibrary</code>関数を使用する。<br> | |||
DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br> | DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br> | ||
<br> | |||
以下の例では、Sample.dllファイルに定義されたHello関数を呼んでいる。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// DLLファイルの読み込み | // DLLファイルの読み込み |