チュートリアル: ダイナミック リンク ライブラリの作成と使用 (C++)

このチュートリアルでは、. C++ アプリケーションで使用するためのダイナミック リンク ライブラリ (DLL) を作成する方法を示します。ライブラリを使用すると、コードを有効に再利用できます。作成するプログラムの同じルーチンを再実装するのではなく、1 回の書き込み、その機能を必要とする apps からそれらを参照します。DLL にコードを記述することによって、参照が apps すべてを再コンパイルしないで変数、およびその DLL を更新できる任意のアプリケーションの領域を節約できます。DLL の詳細については、「Visual C++ の DLL」を参照してください。

このチュートリアルでは、これらのタスクに対応します:

  • DLL プロジェクトの作成。

  • DLL へのクラスの追加。

  • DLL を参照するために読み込み時の動的リンクを使用するコンソール アプリケーションを作成します。

  • アプリケーションのクラスの機能の使用。

  • アプリケーションを実行する。

このチュートリアルでは、C++ 呼び出し規約を使用する apps からのみ呼び出すことができない DLL を作成します。他の言語用 DLL を作成する方法の詳細については、DLL 関数の Visual Basic アプリケーションからの呼び出し方"を参照してください。

必須コンポーネント

このトピックは、C++ 言語の基本を理解していることを前提としています。

ダイナミック リンク ライブラリ (DLL) を作成するには、

  1. メニュー バーで [ファイル][新規][プロジェクト] の順にクリックします。

  2. [新しいプロジェクト] のダイアログ ボックスの左ペインで、[インストール済み][テンプレート][Visual C++] を展開し、[win32] を選択します。

  3. 中央のペインで、を選択 [Win32 コンソール アプリケーション]

  4. ボックス [名前] MathFuncsDll の例のプロジェクトの名前を指定します。ボックス [ソリューション名] DynamicLibrary の例のソリューションの名前を指定します。[OK] を選択します。

  5. [Win32 アプリケーション ウィザード] のダイアログ ボックスの [概要] のページで、[次へ] のボタンをクリックします。

  6. [アプリケーションの設定] のページ、[アプリケーションの種類] の[ [DLL]

  7. プロジェクトを作成するには [完了] のボタンをクリックします。

ダイナミック リンク ライブラリにクラスを追加するには

  1. 新しいクラスのヘッダー ファイルを、メニュー バーで作成するには、プロジェクト[新しい項目の追加]、を選択します。[新しい項目の追加] のダイアログ ボックスの左ペインで、[Visual C++] の[ [コード]。中央のペインで、を選択 [ヘッダー ファイル (.h)]。名前をこのファイルのヘッダーに指定して、MathFuncsDll.h し、[追加] のボタンをクリックします。空白のヘッダー ファイルが表示されます。

  2. ヘッダー ファイルの先頭に次のコードを追加します:

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
  3. MyMathFuncs という名前の加算、減算、乗算、N/A などの一般的な数値演算を実行するための基本的なクラスを追加します。コードは次のようになります。:

    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
    
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
    
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
    
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    

    MATHFUNCSDLL_EXPORTS のシンボルを定義すると、MATHFUNCSDLL_API のシンボルは、このコードのメンバー関数宣言の __declspec(dllexport) 修飾子を設定します。この修飾子は、他のアプリケーションで使用できるように、DLL のエクスポート関数を有効にします。MATHFUNCSDLL_EXPORTS が未定義の場合に、MATHFUNCSDLL_API は、メンバー関数の宣言の __declspec(dllimport) 修飾子を定義します。この修飾子は、他のアプリケーションで使用する DLL から関数のインポート最適化することをコンパイラができます。既定では、MATHFUNCSDLL_EXPORTS は MathFuncsDll のプロジェクトのビルド時に定義されます。詳細については、「dllexport、 dllimport」を参照してください。

    [!メモ]

    コマンド ラインの DLL プロジェクトをビルドして MATHFUNCSDLL_EXPORTS のシンボルを定義する /D のコンパイラ オプションを使用します。

  4. [ソリューション エクスプローラー][MathFuncsDll] のプロジェクトでは、[ソース ファイル] フォルダーで、MathFuncsDll.cpp を開きます。

  5. ソース ファイルに MyMathFuncs の機能を実装します。コードは次のようになります。:

    // MathFuncsDll.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #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 invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
  6. [ビルド]、メニュー バーの [ソリューションのビルド] のをクリックし、ダイナミック リンク ライブラリをコンパイルします。

    [!メモ]

    [ビルド] のメニューを、メニュー バーの表示の Express Edition を使用している場合は、それを有効にするには [ツール][設定][上級者用の設定] を選択し、を [ビルド][ソリューションのビルド] を選択します。

    [!メモ]

    コマンド ラインからプロジェクトをビルドし、出力ファイルが DLL であることを指定します /LD のコンパイラ オプションを使用します。詳細については、「/MD、/MT、/LD (ランタイム ライブラリの使用)」を参照してください。C++ 例外処理を有効にする /EHsc のコンパイラ オプションを使用します。詳細については、「/EH (例外処理モデル)」を参照してください。

DLL を参照するアプリケーションを作成するには

  1. 参照し、メニュー バーに、作成した DLL を使用する C ++.アプリケーションを作成するには、[ファイル][新規作成]プロジェクトを選択します。

  2. 左ペインで、[Visual C++] の[ [win32]

  3. 中央のペインで、を選択 [Win32 コンソール アプリケーション]

  4. ボックス [名前] MyExecRefsDll の例のプロジェクトの名前を指定します。の横 [ソリューション]、ドロップダウン リストから選択 [ソリューションに追加]。これは、DLL と同じソリューションに新しいプロジェクトを追加します。[OK] を選択します。

  5. [Win32 アプリケーション ウィザード] のダイアログ ボックスの [概要] のページで、[次へ] のボタンをクリックします。

  6. [アプリケーションの設定] のページ、[アプリケーションの種類] の[ [コンソール アプリケーション]

  7. [アプリケーションの設定] のページ、[追加のオプション] の下に [プリコンパイル済みヘッダー] のチェック ボックスをオフにします。

  8. プロジェクトを作成するには [完了] のボタンをクリックします。

クラス ライブラリの機能をアプリケーションで使用するには

  1. コンソール アプリケーションを作成すると、空のプログラムが作成されます。ソース ファイルの名前は、以前に選択した名前と同じです。この例では、「MyExecRefsDll.cpp」という名前です。

  2. アプリケーションで、DLL で作成された数値演算ルーチンを使用するには、それを参照する必要があります。これには、[ソリューション エクスプローラー] メニュー バーで MyExecRefsDll プロジェクトを選択します [参照]プロジェクトを選択します。[プロパティ ページ] のダイアログ ボックスで、[共通プロパティ] ノード、[ [Framework と参照] を展開し、[新しい参照の追加] のボタンをクリックします。[参照設定] ダイアログ ボックスの詳細については、「[Framework と参照] ([<プロジェクト名> プロパティ ページ] ダイアログ ボックス - [共通プロパティ])」を参照してください。

  3. [参照の追加] のダイアログ ボックスには、参照できるライブラリが表示されます。含まれる プロジェクト のタブ現在のソリューションのプロジェクトおよびプロジェクト ライブラリが一覧表示されます。[プロジェクト] のタブで、チェック ボックスを MathFuncsDll の横にあるを選択し、[OK] のボタンをクリックします。

  4. DLL のヘッダー ファイルを参照するには、インクルード ディレクトリ パスを変更する必要があります。これを、[プロパティ ページ] のダイアログ ボックスで、[構成プロパティ] のノードを展開し、[C/C++] のノードを展開し、を [全般] を選択します。[追加のインクルード ディレクトリ] の横に、MathFuncsDll.h ヘッダー ファイルの場所のパスを指定します。例の相対パスを使用できます。選択します [OK] のボタンを\MathFuncsDll\-then。

  5. これで、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;
    
        try
        {
            cout << "a / 0 = " <<
                MathFuncs::MyMathFuncs::Divide(a, 0) << endl; 
        }
        catch (const invalid_argument &e) 
        {
            cout << "Caught exception: " << e.what() << endl; 
        }
    
        return 0;
    }
    
  6. [ビルド]、メニュー バーの [ソリューションのビルド] を選択して実行可能ファイルをビルドします。

アプリケーションを実行するには

  1. MyExecRefsDll が既定のプロジェクトとして選択されていることを確認します。次の [ソリューション エクスプローラー] [MyExecRefsDll では、メニュー バー、プロジェクト[スタートアップ プロジェクトに設定] を選択します。

  2. プロジェクトを、メニュー バーで実行するには、[デバッグ][デバッグなしで開始] を選択します。出力は、次のようになります。

a + b = 106.4 a-b *、= -91.6 b = 732.6 a と b = 0.0747475:例外をつかまえました b はゼロにすることはできません。

次の手順

前へ :Visual C++ の DLL |次へ :方法 : クラス ライブラリを作成する

参照

処理手順

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

概念

Visual C++ の DLL

DLL 関数の Visual Basic アプリケーションからの呼び出し方

その他の技術情報

デスクトップ アプリケーションの配置 (Visual C++)