ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) の作成と使用 (C++)
更新 : 2007 年 11 月
最初に作成するライブラリの種類は、ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) です。DLL を使用すると、コードを有効に再利用できます。作成するプログラムごとに同じルーチンを再実装するのではなく、ルーチンを一度記述しておき、その機能を必要とするアプリケーションからそれらを参照します。
ここでは、次の内容について説明します。
新しいダイナミック リンク ライブラリ (DLL) プロジェクトの作成。
ダイナミック リンク ライブラリへのクラスの追加。
ダイナミック リンク ライブラリを参照するアプリケーションの作成。
コンソール アプリケーションでのクラス ライブラリの機能の使用。
アプリケーションの実行。
前提条件
このトピックは、C++ 言語の基本を理解していることを前提としています。C++ の学習を始めたばかりのユーザーには、『C++ Beginner's Guide』(Herb Schildt 著) をお勧めします。このガイドはオンラインで入手できます (https://go.microsoft.com/fwlink/?LinkId=115303)。
新しいダイナミック リンク ライブラリ (DLL) プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[プロジェクトの種類] ペインで、[Visual C++] の [Win32] をクリックします。
[テンプレート] ペインの [Win32 コンソール アプリケーション] をクリックします。
プロジェクトに「MathFuncsDll」などの名前を付け、[プロジェクト名] フィールドに入力します。ソリューションに「DynamicLibrary」などの名前を付け、[ソリューション名] フィールドに入力します。
[OK] をクリックして、Win32 アプリケーション ウィザードを起動します。[Win32 アプリケーション ウィザード] ダイアログ ボックスの [概要] ページで、[次へ] をクリックします。
Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[アプリケーションの種類] の [dll] が使用できる場合はそれを選択し、[dll] が使用できない場合は [コンソール アプリケーション] を選択します。Visual Studio の一部のバージョンは、ウィザードによる DLL プロジェクトの作成をサポートしていません。これは、プロジェクトを DLL にコンパイルするように、後で変更できます。
Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[追加のオプション] の [空のプロジェクト] を選択します。
[完了] をクリックして、プロジェクトを作成します。
ダイナミック リンク ライブラリにクラスを追加するには
新しいクラスのヘッダー ファイルを作成するには、[プロジェクト] メニューの [新しい項目の追加] をクリックします。[新しい項目の追加] ダイアログ ボックスが表示されます。[カテゴリ] ペインで、[Visual C++] の [コード] をクリックします。[テンプレート] ペインの [ヘッダー ファイル (.h)] をクリックします。ヘッダー ファイルに「MathFuncsDll.h」などの名前を付け、[追加] をクリックします。空白のファイルが表示されます。
加算、減算、乗算、除算などの一般的な数値演算を行うための、MyMathFuncs という名前の単純なクラスを追加します。コードは次のようになります。
// MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, double b); // Returns a * b static __declspec(dllexport) double Multiply(double a, double b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, double b); }; }
このコードのメソッド宣言にある __declspec(dllexport) 修飾子に注意してください。これらの修飾子は、メソッドを DLL でエクスポートして、他のアプリケーションで利用できるようにします。詳細については、「dllexport, dllimport」を参照してください。
新しいクラスのソース ファイルを作成するには、[プロジェクト] メニューの [新しい項目の追加] をクリックします。[新しい項目の追加] ダイアログ ボックスが表示されます。[カテゴリ] ペインで、[Visual C++] の [コード] をクリックします。[テンプレート] ペインの [C++ ファイル (.cpp)] をクリックします。ソース ファイルに「MathFuncsDll.cpp」などの名前を付け、[追加] をクリックします。空白のファイルが表示されます。
ソース ファイルに MyMathFuncs の機能を実装します。コードは次のようになります。
// MathFuncsDll.cpp // compile with: /EHsc /LD #include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) { throw new invalid_argument("b cannot be zero!"); } return a / b; } }
プロジェクトを DLL にビルドするには、[プロジェクト] メニューの [MathFuncsDllのプロパティ...] をクリックします。左ペインで、[構成プロパティ] の下の [全般] をクリックします。右ペインで、[構成の種類] を [ダイナミック ライブラリ (.dll)] に変更します。[OK] をクリックして、変更を保存します。
メモ : コマンド ラインからプロジェクトをビルドする場合は、/LD コンパイラ オプションを使用して、出力ファイルが DLL になるように指定します。詳細については、「/MD、/MT、/LD (ランタイム ライブラリの使用)」を参照してください。
[ビルド] メニューの [ソリューションのビルド] をクリックし、ダイナミック リンク ライブラリをコンパイルします。これにより、他のプログラムで使用できる DLL が作成されます。DLL の詳細については、「DLL」を参照してください。
ダイナミック リンク ライブラリを参照するアプリケーションを作成するには
作成したダイナミック リンク ライブラリを参照して使用するアプリケーションを作成するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[プロジェクトの種類] ペインで、[Visual C++] の [Win32] をクリックします。
[テンプレート] ペインの [Win32 コンソール アプリケーション] をクリックします。
プロジェクトに「MyExecRefsDll」などの名前を付け、[プロジェクト名] フィールドに入力します。[ソリューション] の横のドロップダウン リストで、[ソリューションに追加] をクリックします。これにより、ダイナミック リンク ライブラリと同じソリューションに新しいプロジェクトが追加されます。
[OK] をクリックして、Win32 アプリケーション ウィザードを起動します。[Win32 アプリケーション ウィザード] ダイアログ ボックスの [概要] ページで、[次へ] をクリックします。
Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[アプリケーションの種類] の [コンソール アプリケーション] を選択します。
Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[追加のオプション] の下にある [プリコンパイル済みヘッダー] チェック ボックスをオフにします。
[完了] をクリックして、プロジェクトを作成します。
ダイナミック リンク ライブラリの機能をコンソール アプリケーションで使用するには
新しいコンソール アプリケーションを作成すると、空のプログラムが作成されます。ソース ファイルの名前は、前の処理でプロジェクトに付けた名前と同じになります。この例では、「MyExecRefsDll.cpp」という名前です。
ダイナミック リンク ライブラリで作成された数値演算ルーチンを使用するには、ライブラリを参照する必要があります。このためには、[プロジェクト] メニューの [参照] をクリックします。[プロパティ ページ] ダイアログ ボックスで、[共通プロパティ] ノードを展開し、[参照設定] をクリックします。次に、[新しい参照の追加] ボタンをクリックします。[参照設定] ダイアログ ボックスの詳細については、「[フレームワークと参照設定] ([<プロジェクト名> プロパティ ページ] ダイアログ ボックス - [共通プロパティ])」を参照してください。
[参照の追加] ダイアログ ボックスが表示されます。このダイアログ ボックスには、参照できるすべてのライブラリが表示されます。[プロジェクト] タブでは、現在のソリューション内のすべてのプロジェクト、およびそれらに含まれるすべてのライブラリが表示されます。[プロジェクト] タブで、[MathFuncsDll] をクリックします。[OK] をクリックします。[参照の追加] ダイアログ ボックスの詳細については、「[参照の追加] ダイアログ ボックス」を参照してください。
ダイナミック リンク ライブラリのヘッダー ファイルを参照するには、インクルード ディレクトリ パスを変更する必要があります。このためには、[プロパティ ページ] ダイアログ ボックスで、[構成プロパティ] ノードを展開し、次に [C/C++] ノードを展開して、[全般] をクリックします。[追加のインクルード ディレクトリ] の横に、MathFuncsDll.h ヘッダー ファイルへのパスを入力します。
実行可能ファイルは、実行時までダイナミック リンク ライブラリを読み込みません。MathFuncsDll.dll の場所をシステムに指示する必要があります。このためには、PATH 環境変数を使用します。[プロパティ ページ] ダイアログ ボックスで、[構成プロパティ] ノードを展開し、[デバッグ] をクリックします。[環境] の横に、「PATH=<path of MathFuncsDll.dll file>」のように入力します。ここで、<path of MathFuncsDll.dll file> は MathFuncsDll.dll の実際の場所に置き換えます。[OK] をクリックして、すべての変更を保存します。
メモ : 実行可能ファイルを Visual Studio からではなくコマンド ラインから実行する場合、コマンド プロンプトから手動で PATH 環境変数を set PATH=%PATH%;<path of MathFuncsDll.dll file> のように更新する必要があります。ここで、<path of MathFuncsDll.dll file> は MathFuncsDll.dll の実際の場所に置き換えます。
これで、MyMathFuncs クラスをこのアプリケーションで使用できます。MyExecRefsDll.cpp の内容を次のコードに置き換えます。
// MyExecRefsDll.cpp // compile with: /EHsc /link MathFuncsDll.lib #include <iostream> #include "MathFuncsDll.h" using namespace std; int main() { double a = 7.4; int b = 99; cout << "a + b = " << MathFuncs::MyMathFuncs::Add(a, b) << endl; cout << "a - b = " << MathFuncs::MyMathFuncs::Subtract(a, b) << endl; cout << "a * b = " << MathFuncs::MyMathFuncs::Multiply(a, b) << endl; cout << "a / b = " << MathFuncs::MyMathFuncs::Divide(a, b) << endl; return 0; }
[ビルド] メニューの [ソリューションのビルド] をクリックして、実行可能ファイルをビルドします。
アプリケーションを実行するには
MyExecRefsDll が既定のプロジェクトとして選択されていることを確認します。ソリューション エクスプローラで [MyExecRefsDll] を選択し、次に [プロジェクト] メニューの [スタートアップ プロジェクトに設定] をクリックします。
プロジェクトを実行するには、[デバッグ] メニューの [デバッグなしで開始] を選択します。出力は、次のようになります。
a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475
次の手順
前へ :再利用可能なコードの作成 (C++) | 次へ :スタティック ライブラリの作成と使用 (C++)