共用方式為


逐步解說:建立和使用動態連結程式庫 (C++)

這個逐步解說顯示如何建立動態連結程式庫 (DLL) 為 . C 與 C++ 應用程式中使用。使用程式庫是一個好方法重複使用程式碼。而不必重新實作所建立的每個程式中相同的常式,並從需要其功能的應用程式只需要撰寫這些常式一次來參考它們。藉由將程式碼放在 DLL,您節省參考以及您可以更新 DLL,而不需重新編譯所有應用程式的每個應用程式的空間。如需 DLL 的詳細資訊,請參閱 在 Visual C++ Dll

此逐步解說包含下列工作:

  • 建立 DLL 專案。

  • 將類別加入至 DLL。

  • 建立使用參考 DLL 的載入時間動態連結的主控台應用程式。

  • 使用類別中的功能在應用程式。

  • 執行應用程式。

這個逐步解說會建立可以從應用程式只能呼叫使用 C++ 呼叫慣例的 DLL。如需如何建立 DLL 的資訊與其他語言的使用,請參閱 從 Visual Basic 應用程式中呼叫 DLL 函式

必要條件

本主題假設您已了解 C++ 語言的基礎。

若要建立動態連結程式庫 (DLL) 專案

  1. 在功能表列上,選擇 [檔案]、[新增]、[專案]。

  2. 在 [新的專案] 對話方塊的左窗格中,展開 [安裝]],則 [範本], [Visual C++]],然後選取 [Win32]。

  3. 在中間窗格中,選取 [Win32 主控台應用程式]。

  4. 為指定的專案 (例如,在 MathFuncsDll [名稱] 方塊。為指定的方案中, DynamicLibrary 在 [方案名稱] 方塊中。選擇 [確定] 按鈕。

  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 以執行一般算術運算 (例如加法、減法、乘法和除法。程式碼看起來應該像這樣:

    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 專案時, MATHFUNCSDLL_EXPORTS 定義。如需詳細資訊,請參閱dllexport dllimport

    注意事項注意事項

    如果您在命令列的 DLL 專案,請使用 /D 編譯器選項來定義 MATHFUNCSDLL_EXPORTS 符號。

  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 版,請選取 [工具]],則 [設定], [專家的設定] 啟用它,然後選取 [組建]],則 [建置方案]。

    注意事項注意事項

    如果您在命令列建置專案,請使用 /LD 編譯器選項來指定輸出檔是 DLL。如需詳細資訊,請參閱/MD、/MT、/LD (使用執行階段程式庫)。使用 /EHsc 編譯器選項來啟用 C++ 例外狀況處理。如需詳細資訊,請參閱/EH (例外狀況處理模型)

建立參考 DLL 的應用程式。

  1. 若要建立會參考,並使用 DLL 您在功能表列上建立,建立 . C++ 應用程式,請選取 [檔案]],則 [新增], [專案]。

  2. 在左窗格中,在 [Visual C++] 底下,選取 [Win32]。

  3. 在中間窗格中,選取 [Win32 主控台應用程式]。

  4. 為指定的專案 (例如, MyExecRefsDll 在 [名稱] 方塊中。在 [方案] 旁邊,選取下拉式清單中的 [加入至方案] 。這將新專案加入至包含 DLL 相同的方案。選擇 [確定] 按鈕。

  5. 在 [Win32 應用程式精靈] 對話方塊的 [概觀] 頁,請選擇 [] 按鈕。

  6. 在 [應用程式設定] 頁面上,在 [應用程式類型] 下,選取 [主控台應用程式]。

  7. 在 [應用程式設定] 頁面上,在 [其他選項] 下,清除 [先行編譯標頭檔] 核取方塊。

  8. 選擇 [結束] 按鈕以建立專案。

使用類別庫的功能在應用程式

  1. 在您建立主控台應用程式之後,空的程式建置。原始程式檔的名稱與您所選擇的名稱。在本範例中,它的名稱是 MyExecRefsDll.cpp。

  2. 若要使用應用程式 DLL 中建立的數學常式,您必須參考它。若要這樣做,請選取 MyExecRefsDll 專案在 [方案總管]],然後在功能表列上,選擇 [專案]],則 [參考]。在 [屬性頁] 對話方塊中,展開 [通用屬性] 節點,選取 [Framework 和參考]],然後選擇 [加入新的參考] 按鈕。如需 [參考] 對話方塊的詳細資訊,請參閱<專案名稱> 屬性頁對話方塊、通用屬性、架構與參考

  3. [加入參考] 對話方塊會列出您可以參考的程式庫。[專案] 索引標籤會列出目前方案中的專案和所有程式庫所包含。在 [專案] 索引標籤,請在 MathFuncsDll 旁邊的核取方塊,然後選擇 [OK] 按鈕。

  4. 若要參考 DLL 的標頭檔,您必須修改 Include 目錄路徑。若要這麼做,請在 [屬性頁] 對話方塊中,展開 [組態屬性] 節點,然後展開 [C/C++] 節點,然後選取 [概觀]。在 [其他 Include 目錄] 旁邊,請指定 MathFuncsDll.h 標頭檔所在位置的路徑。您可以使用一個相對路徑,例如,..\MathFuncsDll\—然後選擇 [OK] 按鈕。

  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 = a b * -91.6 = 732.6/b = 0.0747475) 時攔截到例外狀況:表示不可以為零!

後續步驟

上一個主題:在 Visual C++ Dll |下一個主題HOW TO:建立類別庫

請參閱

工作

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

概念

在 Visual C++ Dll

從 Visual Basic 應用程式中呼叫 DLL 函式

其他資源

部署桌上型應用程式 (Visual C++)