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

ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
25行目: 25行目:
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br>
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br>
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br>
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.def
  MainDLL.def
  LIBRARY MainDLL
  LIBRARY MainDLL
32行目: 32行目:
         SampleFunc  @1
         SampleFunc  @1
         TestFunc    @2
         TestFunc    @2
  </source>
  </syntaxhighlight>
<br>
<br>
次に、"MainDLL.h"ファイルは以下のように記載する。<br>
次に、"MainDLL.h"ファイルは以下のように記載する。<br>
defファイルによるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。<br>
defファイルによるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.h
  MainDLL.h
   
   
49行目: 49行目:
  DLL_EXPORT int     __stdcall SampleFunc(int *lp1, int *lp2);
  DLL_EXPORT int     __stdcall SampleFunc(int *lp1, int *lp2);
  DLL_EXPORT double  __stdcall TestFunc(double *lp1, double *lp2);
  DLL_EXPORT double  __stdcall TestFunc(double *lp1, double *lp2);
  </source>
  </syntaxhighlight>
<br>
<br>
最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br>
最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.cpp
  MainDLL.cpp
   
   
67行目: 67行目:
     // 以下略
     // 以下略
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
==== defファイルを使用しない ====
==== defファイルを使用しない ====
76行目: 76行目:
<br>
<br>
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br>
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.h // ファイルの先頭に以下を追加する。
  MainDLL.h // ファイルの先頭に以下を追加する。
   
   
91行目: 91行目:
   
   
  #endif //__MAINDLL_H__
  #endif //__MAINDLL_H__
  </source>
  </syntaxhighlight>
<br>
<br>
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br>
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.h
  MainDLL.h
   
   
107行目: 107行目:
     }
     }
  #endif
  #endif
  </source>
  </syntaxhighlight>
<br>
<br>
"MainDLL.cpp"ファイルの先頭に以下を記載する。<br>
"MainDLL.cpp"ファイルの先頭に以下を記載する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.cpp
  MainDLL.cpp
   
   
  #include "StdAfx.h"
  #include "StdAfx.h"
  #include "MainDLL.h"
  #include "MainDLL.h"
  </source>
  </syntaxhighlight>
<br>
<br>
"MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。<br>
"MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.cpp
  MainDLL.cpp
   
   
125行目: 125行目:
     // 以下略
     // 以下略
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


236行目: 236行目:
DLLファイルを読み込むには、Windows APIでは<code>LoadLibrary</code>関数を使用する。<br>
DLLファイルを読み込むには、Windows APIでは<code>LoadLibrary</code>関数を使用する。<br>
DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br>
DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // DLLファイルの読み込み
  // DLLファイルの読み込み
  HMODULE hModule = ::LoadLibrary(_T("Sample.dll"));
  HMODULE hModule = ::LoadLibrary(_T("Sample.dll"));
245行目: 245行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
次に、DLLファイルから呼ぶ関数のアドレスを取得する。<br>
次に、DLLファイルから呼ぶ関数のアドレスを取得する。<br>
252行目: 252行目:
Hello関数のアドレスを取得するには、<code>GetProcAddress</code>関数を使用する。<br>
Hello関数のアドレスを取得するには、<code>GetProcAddress</code>関数を使用する。<br>
Hello関数のアドレスの取得に失敗した場合は、必ず<code>FreeLibrary</code>関数を呼び、DLLファイルのハンドルを解放する。<br>
Hello関数のアドレスの取得に失敗した場合は、必ず<code>FreeLibrary</code>関数を呼び、DLLファイルのハンドルを解放する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  typedef int (*FUNC)(char *);
  typedef int (*FUNC)(char *);
   
   
264行目: 264行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
最後に、GetProcAddress関数で取得したHello関数のアドレスに引数を渡す。<br>
最後に、GetProcAddress関数で取得したHello関数のアドレスに引数を渡す。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 関数の呼び出し
  // 関数の呼び出し
  int ret = (*lpFunc)(tmp);
  int ret = (*lpFunc)(tmp);
277行目: 277行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
以下に、サンプルコードの全体を示す。<br>
以下に、サンプルコードの全体を示す。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include "stdafx.h"
  #include "stdafx.h"
  #include <Windows.h>
  #include <Windows.h>
329行目: 329行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
 
== デバッグ方法 ==
C++DLLのデバッグ方法を、以下に記載する。<br>
<br>
# [ソリューションエクスプローラー]において、C++DLLプロジェクトを右クリックして、[プロパティ]を選択する。<br>
# [<Project>プロパティページ]画面が開くので、画面上部の[構成]プルダウンから[デバッグ]を選択する。
# 次に、画面左にある[構成プロパティ] - [デバッグ]を選択する。
# 画面右にある[起動するデバッガー]プルダウンから[ローカルWindowsデバッガー]または[リモートWindowsデバッガー]のいずれかを選択する。
# 画面右にある[コマンド]項目または[リモートコマンド]項目において、呼び出し元の実行ファイルのフルパスを入力する。<br>コマンドライン引数が必要な場合、[コマンド引数]項目に任意の必要なコマンドライン引数を入力する。
# [OK]ボタンを押下する。
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]]
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]]

案内メニュー