「ライブラリの基礎 - DLLの作成(C/C++/MFC)」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
編集の要約なし
198行目: 198行目:
これは、/DYNAMICBASEオプションを指定することと同じことである。<br>
これは、/DYNAMICBASEオプションを指定することと同じことである。<br>
または、ソースコード内において、#pragmaディレクティブで指定する。<br>
または、ソースコード内において、#pragmaディレクティブで指定する。<br>
<br><br>
== DLLの暗黙的リンク ==
EXEファイルのプロジェクトに、DLLファイルを暗黙的リンクする方法を記載する。<br>
例として、CppEXE.exeとCppDLL.dllが存在するものとして設定している。<br>
<br>
# まず、CppEXE.exeのプロジェクトを起動する。
# [プロジェクト]メニュー - [CppEXEのプロパティ] - [構成プロパティ] - [C/C++] - [全般] - [追加のインクルードディレクトリ]項目に、<br>CppDLL.dllのヘッダファイル(CppDLL.h)が存在するディレクトリを追加する。
# 次に、[構成プロパティ] - [リンカー] - [全般] - [追加のライブラリディレクトリ]項目に、<br>DLLのライブラリファイル(CppDLL.lib)が存在するディレクトリを追加する。
# 最後に、[構成プロパティ] - [リンカー] - [入力] - [追加の依存ファイル]項目に、CppDLL.libと記述する。
<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を読み込む。<br>DLLが見つからない場合、NULLが返る。<br>DLL内の関数を実行するには、GetProcAddress()関数で関数アドレスを取得する必要がある。
| 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が返る。
| 関数との紐付け || ライブラリファイルで、DLL内の関数名(序数も含む)が保持されている。<br>この関数名(あるいは序数)が一致しないとNULLが返る。 || <code>GetProcAddress</code>関数で、DLL内の関数名(あるいは序数)を指定する。<br>この関数名(または序数)が一致しないとNULLが返る。
|-
|-
| 暗黙的 / 明示的とは || EXEの実行準備段階でDLLを自動で読み込むので、暗黙的という。 || 設計者がLoadLibrary()関数を使用してDLLを呼び出すので、明示的という。
| 暗黙的 / 明示的とは || EXEの実行準備段階でDLLを自動で読み込むので、暗黙的という。 || 設計者が<code>LoadLibrary</code>関数を使用してDLLを呼び出すので、明示的という。
|-
|-
| 静的 / 動的とは || リンカーでリンクした時点で使用するDLLの種類や関数が決まるので、静的という。 || LoadLibrary()関数とGetProcAddress()関数を使用してDLL内の関数を自由に使用できるので、動的という。
| 静的 / 動的とは || リンカでリンクした時点で使用するDLLの種類や関数が決まるので、静的という。 || <code>LoadLibrary</code>関数と<code>GetProcAddress</code>関数を使用してDLL内の関数を自由に使用できるので、動的という。
|}
|}
</center>
</center>
<br><br>
<br><br>


== DLLファイルの読み込みと関数の呼び出し ==
== DLLの暗黙的リンク ==
以下の例では、Sample.dllファイルに定義されたHello関数を呼んでいる。<br>
EXEファイルのプロジェクトに、DLLファイルを暗黙的リンクする方法を記載する。<br>
<br>
<br>
DLLファイルを読み込むには、Windows APIでは<code>LoadLibrary</code>関数を使用する。<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ファイルの読み込み

案内メニュー