逐步解說:建立和使用動態連結程式庫 (C++)
我們將會建立的第一個程式庫類型是動態連結程式庫 (DLL)。 使用 DLL 是重複使用程式碼的好方法, 您只需要撰寫這些常式一次,並從需要其功能的應用程式中參考它們,而不需要在所建立的每個程式中都重新實作相同的常式。
本逐步解說將涵蓋下列項目:
建立新的動態連結程式庫 (DLL) 專案。
將類別加入至動態連結程式庫。
建立會參考動態連結程式庫的應用程式。
在主控台應用程式中使用類別庫的功能。
執行應用程式。
必要條件
本主題假設您已了解 C++ 語言的基礎。 如果您才剛開始學習 C++,建議您參考 Herb Schildt 所著的《C++ Beginner's Guide》。您可以在 https://www.microsoft.com/taiwan/vstudio/ 找到這份文件的線上版本。
若要建立新的動態連結程式庫 (DLL) 專案
在 [檔案] 功能表中,選取 [新增],然後選取 [專案]。
在 [專案類型] 窗格上,選取 [Visual C++] 下的 [Win32]。
選取 [範本] 窗格上的 [Win32 主控台應用程式]。
選擇專案名稱,例如 MathFuncsDll,然後在 [名稱] 欄位中輸入此名稱。 選擇方案名稱,例如 DynamicLibrary,然後在 [方案名稱] 欄位中輸入此名稱。
按一下 [確定] 啟動 [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) 修飾詞 (Modifier)。 這些修飾詞可讓方法經由 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; } }
從 [專案] 功能表,選取 [MathFuncsDll 屬性],準備將專案建置成 DLL。 在左邊窗格的 [組態屬性] 下,選取 [一般]。 在右邊窗格中,將 [組態型別] 變更為 [動態程式庫 (.dll)]。 按一下 [確定] 儲存這些變更。
注意事項 如果是從命令列建置專案,請使用 /LD 編譯器選項指定輸出檔案應該是 DLL。 如需詳細資訊,請參閱 /MD、/MT、/LD (使用執行階段程式庫)。
從 [建置] 功能表中選取 [建置方案],編譯動態連結程式庫。 這會建立可供其他程式使用的 DLL。 如需 DLL 的詳細資訊,請參閱 DLL。
若要建立會參考動態連結程式庫的應用程式
若要建立將會參考及使用剛才所建立之動態連結程式庫的應用程式,請從 [檔案] 功能表中選取 [新增],再選取 [專案]。
在 [專案類型] 窗格上,選取 [Visual C++] 下的 [Win32]。
選取 [範本] 窗格上的 [Win32 主控台應用程式]。
選擇專案名稱,例如 MyExecRefsDll,然後在 [名稱] 欄位中輸入此名稱。 在 [方案] 旁邊,從下拉式清單中選取 [加入至方案]。 這樣會將此新專案加入至和動態連結程式庫相同的方案中。
按一下 [確定] 啟動 [Win32 應用程式精靈]。 在 [Win32 應用程式精靈] 對話方塊的 [概觀] 頁面上,按 [下一步]。
在 [Win32 應用程式精靈] 之 [應用程式設定] 頁面的 [應用程式類型] 下,選取 [主控台應用程式]。
在 [Win32 應用程式精靈] 之 [應用程式設定] 頁面的 [其他選項] 下,清除 [先行編譯標頭] 核取方塊。
按下 [完成],即可建立專案。
若要在主控台應用程式中使用類別庫的功能
建立了新的主控台應用程式之後,會自動為您建立空白程式。 原始程式檔的名稱將會與您為以上專案所選擇的名稱相同。 在本範例中,它的名稱是 MyExecRefsDll.cpp。
若要使用在動態連結程式庫中建立的數學常式,您必須參考該程式庫。 若要這麼做,請在 [方案總管] 中選取 [MyExecRefsDll] 專案,然後選取 [專案] 功能表中的 [參考]。 在 [屬性頁] 對話方塊中,展開 [通用屬性] 節點,選取 [架構和參考],然後選取 [加入新參考...] 按鈕。 如需 [參考] 對話方塊的詳細資訊,請參閱<專案名稱> 屬性頁對話方塊、通用屬性、架構與參考。
接著會顯示 [加入參考] 對話方塊。 這個對話方塊會列出您可以參考的所有程式庫。 [專案] 索引標籤會列出目前方案中的所有專案,以及這些專案所包含的任何程式庫。 選取 [專案] 索引標籤上的 [MathFuncsDll]。 然後按一下 [確定]。
若要參考動態連結程式庫的標頭檔,您必須修改 Include 目錄路徑。 若要這麼做,請在 [屬性頁] 對話方塊中,依序展開 [組態屬性] 節點、[C/C++] 節點,然後選取 [一般]。 在 [其他 Include 目錄] 旁邊,輸入 MathFuncsDll.h 標頭檔所在位置的路徑。
除非進入執行階段,可執行檔才會載入動態連結程式庫, 您必須告訴系統到哪裡去找 MathFuncsDll.dll, 您會使用 PATH 環境變數來做到這點。 若要達成這個目的,請在 [屬性頁] 對話方塊中,展開 [組態屬性] 節點並選取 [偵錯]。 在 [環境] 旁邊,輸入下列內容:PATH=<MathFuncsDll.dll 檔案的路徑>,其中將 <MathFuncsDll.dll 檔案的路徑> 取代成 MathFuncsDll.dll 的實際位置。 按一下 [確定] 儲存所有變更。
注意事項 如果您要從命令列而非 Visual Studio 執行可執行檔,就必須從命令提示字元手動更新 PATH 環境變數,如下所示:set PATH=%PATH%;<MathFuncsDll.dll 檔案的路徑>,其中將 <MathFuncsDll.dll 檔案的路徑> 取代成 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++)