演練:建立和使用動態連結程式庫 (C++)
Visual Studio 2008
我們將建立的第一種類型的庫是動態連結程式庫 (DLL)。 使用 DLL 是一種重用代碼的絕佳方式。 您不必在自己建立的每個程式中重新實現同一常式,而只需對這些常式編寫一次,然後從需要該功能的應用程式引用它們即可。
本演練涵蓋以下內容:
- 建立新的動態連結程式庫 (DLL) 項目。
- 向動態連結程式庫添加類。
- 建立引用動態連結程式庫的應用程式。
- 在控制台應用程式中使用類庫的功能。
- 運行應用程式。
系統必備
本主題假定您具備 C++ 語言的基礎知識。 如果您是剛開始學習 C++,建議您參閱 Herb Schildt 編寫的“C++ Beginner's Guide”(《C++ 初學者指南》),該書可從 http://go.microsoft.com/fwlink/?LinkId=115303 線上獲得。
建立新的動態連結程式庫 (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) 修飾符。 這些修飾符使 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)”。 單擊“確定”儲存更改。
注意 |
如果您從命令列產生項目,請使用 /LD 編譯器選項指定輸出檔案應為 DLL。 有關更多資訊,請參見 /MD、/MT、/LD(使用運行庫)。 |
- 編譯該動態連結程式庫,方法是選擇“產生”菜單中的“產生解決方案”。 這樣就建立了一個可供其他程式使用的 DLL。 有關 DLL 的詳細資料,請參見 DLL。
建立引用動態連結程式庫的應用程式
- 若要建立將引用並使用剛建立的動態連結程式庫的應用程式,請從“檔案”菜單中選擇“建立”,然後選擇“項目...”。
- 在“項目類型”窗格中,選擇“Visual C++”下的“Win32”。
- 在“模板”窗格中,選擇“Win32 控制台應用程式”。
- 為項目選擇一個名稱(如 MyExecRefsDll),並將其鍵入“名稱”欄位。 從“解決方案”旁邊的下拉式清單中選擇“添入解決方案”。 這會將新項目添加到該動態連結程式庫所屬的同一個解決方案中。
- 單擊“確定”啟動“Win32 應用程式嚮導”。 在“Win32 應用程式嚮導”對話方塊的“概述”頁中,單擊“下一步”。
- 在“Win32 應用程式嚮導”的“應用程式設定”頁中,選擇“應用程式類型”下的“控制台應用程式”。
- 在“Win32 應用程式嚮導”的“應用程式設定”頁中,清除“附加選項”下的“先行編譯頭”複選框。
- 按“完成”建立項目。
在控制台應用程式中使用類庫的功能
- 建立新的控制台應用程式後,將為您建立一個空程式。 源檔案的名稱與您在前面為項目選擇的名稱相同。 在本樣本中,名為“MyExecRefsDll.cpp”。
- 若要使用在動態連結程式庫中建立的算術常式,則必須引用該庫。 若要執行此操作,請在方案總管中選擇 MyExecRefsDll 項目,然後從“項目”菜單中選擇“引用...”。 在“屬性頁面”對話方塊中,展開“通用屬性”節點,選擇“架構和引用”,然後選擇“添加新引用...”按鈕。 有關“引用...”對話方塊的更多資訊,請參見“<Projectname> 屬性頁面”對話方塊 ->“通用屬性”->“架構和引用”。
- 顯示“添加引用”對話方塊。 此對話方塊列出了所有可以引用的庫。 “項目”選項卡列出了當前解決方案中的所有項目,以及它們包含的所有庫。 在“項目”選項卡中,選擇 MathFuncsDll。 然後單擊“確定”。
- 若要引用動態連結程式庫的標頭檔,必須修改包含目錄路徑。 為此,請在“屬性頁面”對話方塊中展開“配置屬性”節點,然後展開“C/C++”節點,並選擇“常規”。 在“附加元件封裝含目錄”旁邊,鍵入 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