逐步解說:建立和使用動態連結程式庫 (C++)
這個逐步解說顯示如何建立動態連結程式庫 (DLL) 為 . C 與 C++ 應用程式中使用。使用程式庫是一個好方法重複使用程式碼。而不必重新實作所建立的每個程式中相同的常式,並從需要其功能的應用程式只需要撰寫這些常式一次來參考它們。藉由將程式碼放在 DLL,您節省參考以及您可以更新 DLL,而不需重新編譯所有應用程式的每個應用程式的空間。如需 DLL 的詳細資訊,請參閱 在 Visual C++ Dll。
此逐步解說包含下列工作:
建立 DLL 專案。
將類別加入至 DLL。
建立使用參考 DLL 的載入時間動態連結的主控台應用程式。
使用類別中的功能在應用程式。
執行應用程式。
這個逐步解說會建立可以從應用程式只能呼叫使用 C++ 呼叫慣例的 DLL。如需如何建立 DLL 的資訊與其他語言的使用,請參閱 從 Visual Basic 應用程式中呼叫 DLL 函式。
必要條件
本主題假設您已了解 C++ 語言的基礎。
若要建立動態連結程式庫 (DLL) 專案
在功能表列上,選擇 [檔案]、[新增]、[專案]。
在 [新的專案] 對話方塊的左窗格中,展開 [安裝]],則 [範本], [Visual C++]],然後選取 [Win32]。
在中間窗格中,選取 [Win32 主控台應用程式]。
為指定的專案 (例如,在 MathFuncsDll [名稱] 方塊。為指定的方案中, DynamicLibrary 在 [方案名稱] 方塊中。選擇 [確定] 按鈕。
在 [Win32 應用程式精靈] 對話方塊的 [概觀] 頁,請選擇 [下] 按鈕。
在 [應用程式設定] 頁面上,在 [應用程式類型] 下,選取 [DLL]。
選擇 [結束] 按鈕以建立專案。
若要將類別加入至動態連結程式庫
若要建立新類別的標頭檔,在功能表列上,選擇 [專案]],則 [加入新項目。]。在 [加入新項目。] 對話方塊中,選取左窗格中,在 [Visual C++] 下,選取 [程式碼]。在中間窗格中,選取 [標頭檔 (.h)]。為標頭中指定的檔案名稱 (例如, MathFuncsDll.h 然後選擇 [加入] 按鈕。空白的標頭檔中。
將下列程式碼加入至標頭檔的開頭:
// MathFuncsDll.h #ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif
將基底分類名稱 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 符號。
在 [方案總管] 中的 [MathFuncsDll] 專案,在 [原始程式檔] 資料夾中,開啟 MathFuncsDll.cpp。
在原始程式檔中實作 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; } }
藉由選取 [組建] 編譯動態連結程式庫,請在功能表列上的 [建置方案] 。
注意事項 如果您使用不會顯示 [組建] 功能表,請在功能表列上的 Express 版,請選取 [工具]],則 [設定], [專家的設定] 啟用它,然後選取 [組建]],則 [建置方案]。
注意事項 如果您在命令列建置專案,請使用 /LD 編譯器選項來指定輸出檔是 DLL。如需詳細資訊,請參閱/MD、/MT、/LD (使用執行階段程式庫)。使用 /EHsc 編譯器選項來啟用 C++ 例外狀況處理。如需詳細資訊,請參閱/EH (例外狀況處理模型)。
建立參考 DLL 的應用程式。
若要建立會參考,並使用 DLL 您在功能表列上建立,建立 . C++ 應用程式,請選取 [檔案]],則 [新增], [專案]。
在左窗格中,在 [Visual C++] 底下,選取 [Win32]。
在中間窗格中,選取 [Win32 主控台應用程式]。
為指定的專案 (例如, MyExecRefsDll 在 [名稱] 方塊中。在 [方案] 旁邊,選取下拉式清單中的 [加入至方案] 。這將新專案加入至包含 DLL 相同的方案。選擇 [確定] 按鈕。
在 [Win32 應用程式精靈] 對話方塊的 [概觀] 頁,請選擇 [下] 按鈕。
在 [應用程式設定] 頁面上,在 [應用程式類型] 下,選取 [主控台應用程式]。
在 [應用程式設定] 頁面上,在 [其他選項] 下,清除 [先行編譯標頭檔] 核取方塊。
選擇 [結束] 按鈕以建立專案。
使用類別庫的功能在應用程式
在您建立主控台應用程式之後,空的程式建置。原始程式檔的名稱與您所選擇的名稱。在本範例中,它的名稱是 MyExecRefsDll.cpp。
若要使用應用程式 DLL 中建立的數學常式,您必須參考它。若要這樣做,請選取 MyExecRefsDll 專案在 [方案總管]],然後在功能表列上,選擇 [專案]],則 [參考]。在 [屬性頁] 對話方塊中,展開 [通用屬性] 節點,選取 [Framework 和參考]],然後選擇 [加入新的參考] 按鈕。如需 [參考] 對話方塊的詳細資訊,請參閱<專案名稱> 屬性頁對話方塊、通用屬性、架構與參考。
[加入參考] 對話方塊會列出您可以參考的程式庫。[專案] 索引標籤會列出目前方案中的專案和所有程式庫所包含。在 [專案] 索引標籤,請在 MathFuncsDll 旁邊的核取方塊,然後選擇 [OK] 按鈕。
若要參考 DLL 的標頭檔,您必須修改 Include 目錄路徑。若要這麼做,請在 [屬性頁] 對話方塊中,展開 [組態屬性] 節點,然後展開 [C/C++] 節點,然後選取 [概觀]。在 [其他 Include 目錄] 旁邊,請指定 MathFuncsDll.h 標頭檔所在位置的路徑。您可以使用一個相對路徑,例如,..\MathFuncsDll\—然後選擇 [OK] 按鈕。
現在您就可以在此應用程式中使用 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; }
您可以選擇 [組建] 以建置可執行檔,請在功能表列上的 [建置方案] 。
若要執行應用程式
確定已選取 MyExecRefsDll,預設專案。在 [方案總管] 中,選取 MyExecRefsDll,然後在功能表列上,選擇 [專案]],則 [做為啟始專案的集合]。
若要執行專案,請在功能表列上,選擇 [偵錯], [開始,不進行偵錯]。輸出應該會與以下相似:
a b + 106.4 = a 到 b = a b * -91.6 = 732.6/b = 0.0747475) 時攔截到例外狀況:表示不可以為零!
後續步驟
上一個主題:在 Visual C++ Dll |下一個主題:HOW TO:建立類別庫
請參閱
工作
Walkthrough: Deploying Your Program (C++)