MFC - 庫



是一組函式、類或其他資源,可以提供給需要已實現實體的程式,而無需瞭解這些函式、類或資源是如何建立的或如何工作的。庫使程式設計師可以輕鬆地使用其他人或公司建立的函式、類和資源等,並相信此外部來源是可靠且高效的。與庫相關的獨特功能包括:

  • 庫的建立和功能類似於普通的常規程式,使用函式或其他資源並與其他程式通訊。

  • 為了實現其功能,庫包含其他程式需要完成其功能的函式。

  • 同時,庫可能使用其他程式不需要的某些函式。

  • 使用庫的程式也稱為庫的客戶端。

您將在庫中建立或包含兩種型別的函式:

  • 內部函式僅供庫本身使用,庫的客戶端不需要訪問這些函式。

  • 外部函式是可以被庫客戶端訪問的函式。

您將在程式中處理的兩大類庫:

  • 靜態庫
  • 動態庫

靜態庫

靜態庫是一個包含函式、類或資源的檔案,外部程式可以使用它來補充其功能。要使用庫,程式設計師必須建立指向它的連結。專案可以是控制檯應用程式、Win32 應用程式或 MFC 應用程式。庫副檔名為 lib。

步驟 1 - 讓我們透過建立一個新的 Win32 專案來了解靜態庫的一個簡單示例。

Static Library

步驟 2 - 在應用程式嚮導對話方塊上,選擇靜態庫選項。

Static Library

步驟 3 - 點選完成繼續。

Static Library

步驟 4 - 在解決方案資源管理器中右鍵單擊專案,並從新增→新建項…選單選項新增標頭檔案。

Static Library

步驟 5 - 在名稱欄位中輸入 Calculator.h 並單擊新增。

在標頭檔案中新增以下程式碼:

#pragma once
#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_
double Min(const double *Numbers, const int Count);
double Max(const double *Numbers, const int Count);
double Sum(const double *Numbers, const int Count);
double Average(const double *Numbers, const int Count);
long GreatestCommonDivisor(long Nbr1, long Nbr2);
#endif // _CALCULATOR_H_

步驟 6 - 在專案中新增一個源 (*.cpp) 檔案。

Static Library

步驟 7 - 在名稱欄位中輸入 Calculator.cpp 並單擊新增。

步驟 8 - 在 *.cpp 檔案中新增以下程式碼:

#include "StdAfx.h"
#include "Calculator.h"
double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total) {
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
       S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

步驟 9 - 透過單擊生成→生成 MFCLib從主選單生成此庫。

Static Library

步驟 10 - 當庫成功生成時,它將顯示上述訊息。

步驟 11 - 要使用庫中的這些函式,讓我們從檔案→新建→專案新增另一個基於 MFC 的對話方塊應用程式。

Static Library

步驟 12 - 轉到 MFCLib\Debug 資料夾並將標頭檔案和 *.lib 檔案複製到 MFCLibTest 專案,如下圖所示。

Static Library

步驟 13 - 要將庫新增到當前專案,請在主選單上單擊專案→新增現有項,然後選擇 MFCLib.lib。

步驟 14 - 設計您的對話方塊,如下圖所示。

Static Library

步驟 15 - 為兩個值為 double 型別的編輯控制元件新增值變數。

Static Library

步驟 16 - 為對話方塊末尾的靜態文字控制元件新增值變數。

Static Library

步驟 17 - 為“計算”按鈕新增事件處理程式。

要新增來自庫的功能,我們需要在 CMFCLibTestDlg.cpp 檔案中包含標頭檔案。

#include "stdafx.h"
#include "MFCLibTest.h"
#include "MFCLibTestDlg.h"
#include "afxdialogex.h"
#include "Calculator.h"

步驟 18 - 這是按鈕事件處理程式的實現。

void CMFCLibTestDlg::OnBnClickedButtonCal() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);
   
   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);

   UpdateData(FALSE);
}

步驟 19 - 當編譯並執行上述程式碼時,您將看到以下輸出。

Static Library

步驟 20 - 在編輯欄位中輸入兩個值,然後單擊“計算”。您現在將看到從庫計算結果。

Static Library

動態庫

Win32 DLL 是一個庫,可以提供給在 Microsoft Windows 計算機上執行的程式。作為一個普通的庫,它由分組在一個檔案中的函式和/或其他資源組成。

DLL 的縮寫代表動態連結庫。這意味著,與靜態庫相反,DLL 允許程式設計師決定何時以及如何將其他應用程式連結到這種型別的庫。

例如,DLL 允許不同的應用程式根據需要使用其庫。事實上,在不同程式設計環境下建立的應用程式可以使用儲存在一個特定 DLL 中的函式或資源。為此,應用程式動態連結到庫。

步驟 1 - 讓我們透過建立一個新的 Win32 專案來了解一個簡單的示例。

Dynamic Library

步驟 2 - 在應用程式型別部分,單擊 DLL 單選按鈕。

Dynamic Library

步驟 3 - 點選完成繼續。

步驟 4 - 在 MFCDynamicLib.cpp 檔案中新增以下函式,並使用以下方法公開其定義:

extern "C" _declspec(dllexport)

步驟 5 - 為每個將在 DLL 外部訪問的函式使用 _declspec(dllexport) 修飾符。

// MFCDynamicLib.cpp : Defines the exported functions for the DLL application.//

#include "stdafx.h"

extern "C" _declspec(dllexport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total){
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

步驟 6 - 要建立 DLL,請在主選單上單擊生成 > 生成 MFCDynamicLib

Dynamic Library

步驟 7 - 成功建立 DLL 後,您將看到輸出視窗中顯示一條訊息。

步驟 8 - 開啟 Windows 資源管理器,然後開啟當前專案的 Debug 資料夾。

步驟 9 - 請注意,已建立了一個副檔名為 dll 的檔案和另一個副檔名為 lib 的檔案。

Dynamic Library

步驟 10 - 要使用副檔名為 dll 的檔案進行測試,我們需要從檔案→新建→專案建立一個新的基於 MFC 的對話方塊應用程式。

Dynamic Library

步驟 11 - 轉到 MFCDynamicLib\Debug 資料夾並將 *.dll 和 *.lib 檔案複製到 MFCLibTest 專案,如下圖所示。

Dynamic Library

步驟 12 - 要將 DLL 新增到當前專案,請在主選單上單擊專案→新增現有項,然後選擇 MFCDynamicLib.lib 檔案。

步驟 13 - 設計您的對話方塊,如下圖所示。

Dynamic Library

步驟 14 - 為兩個值為 double 型別的編輯控制元件新增值變數。

Dynamic Library

步驟 15 - 為對話方塊末尾的靜態文字控制元件新增值變數。

Dynamic Library

步驟 16 - 為“計算”按鈕新增事件處理程式。

步驟 17 - 在使用 DLL 的專案中,必須使用 _declspec(dllimport) 修飾符宣告將要訪問的每個函式。

步驟 18 - 在 MFCLibTestDlg.cpp 檔案中新增以下函式宣告。

extern "C" _declspec(dllimport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

步驟 19 - 這是按鈕事件處理程式的實現。

void CMFCLibTestDlg::OnBnClickedButtonCal() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);

   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);
 
   UpdateData(FALSE);
}

步驟 20 - 當編譯並執行上述程式碼時,您將看到以下輸出。

Dynamic Library

步驟 21 - 在編輯欄位中輸入兩個值,然後單擊“計算”。您現在將看到從 DLL 計算結果。

Dynamic Library
廣告