MFC – 库

MFC – 库


一个是一组可以提供给那些需要已实施实体,而不需要知道他们是如何创建这些函数,类或资源或如何运作程序函数,类或其他资源。库使程序员可以轻松地使用由其他人或公司创建的函数、类和资源等,并相信此外部源是可靠且高效的。与库相关的一些独特功能是 –

  • 库的创建和功能类似于普通的常规程序,使用函数或其他资源并与其他程序通信。

  • 为了实现其功能,库包含其他程序完成其功能所需的功能。

  • 同时,库可能会使用其他程序不需要的某些功能。

  • 使用库的程序也称为库的客户端。

您将在库中创建或包含两种类型的函数 –

  • 内部函数仅由库本身使用,库的客户端不需要访问这些函数。

  • 外部函数是库的客户端可以访问的函数。

您将在程序中处理两大类库 –

  • 静态库
  • 动态库

静态库

一个静态库是包含函数,类或资源外部程序可以用它来补充其功能的文件。要使用库,程序员必须创建指向它的链接。该项目可以是控制台应用程序、Win32 或 MFC 应用程序。库文件具有 lib 扩展名。

第 1 步– 让我们通过创建一个新的 Win32 项目来研究一个简单的静态库示例。

静态库

步骤 2 – 在应用程序向导对话框中,选择静态库选项。

静态库

步骤 3 – 单击完成继续。

静态库

步骤 4 – 右键单击​​解决方案资源管理器中的项目,然后从“添加”→“新项目”…菜单选项添加一个头文件。

静态库

步骤 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) 文件。

静态库

步骤 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 – 通过单击Build → Build MFCLib从主菜单构建此库

静态库

步骤 10 – 成功构建库后,它将显示上述消息。

步骤 11 – 要使用库中的这些函数,让我们添加另一个基于文件 → 新建 → 项目的 MFC 对话框应用程序。

静态库

步骤 12 – 转到 MFCLib\Debug 文件夹并将头文件和 *.lib 文件复制到 MFCLibTest 项目,如下面的快照所示。

静态库

步骤 13 – 要将库添加到当前项目,在主菜单上,单击项目 → 添加现有项目并选择 MFCLib.lib。

步骤 14 – 设计您的对话框,如下面的快照所示。

静态库

步骤 15 – 为值类型为 double 的两个编辑控件添加值变量。

静态库

步骤 16 – 为对话框末尾的静态文本控件添加值变量。

静态库

步骤 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 – 编译并执行上述代码后,您将看到以下输出。

静态库

步骤 20 – 在编辑字段中输入两个值,然后单击计算。您现在将看到从库中计算后的结果。

静态库

动态库

Win32 DLL 是一个库,可供在 Microsoft Windows 计算机上运行的程序使用。作为一个普通的库,它由分组在一个文件中的函数和/或其他资源组成。

DLL 缩写代表动态链接库。这意味着,与静态库不同,DLL 允许程序员决定何时以及如何将其他应用程序链接到此类库。

例如,DLL 允许不同的应用程序在它们认为合适和必要时使用其库。事实上,在不同编程环境中创建的应用程序可以使用存储在一个特定 DLL 中的函数或资源。因此,应用程序动态链接到库。

第 1 步– 让我们通过创建一个新的 Win32 项目来研究一个简单的例子。

动态库

步骤 2 – 在应用程序类型部分,单击 DLL 单选按钮。

动态库

步骤 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,在主菜单上,从主菜单中单击Build > Build MFCDynamicLib

动态库

步骤 7 – 成功创建 DLL 后,您将在输出窗口中看到一条消息显示。

步骤 8 – 打开 Windows 资源管理器,然后打开当前项目的 Debug 文件夹。

步骤 9 – 请注意,已经创建了一个扩展名为 dll 的文件和另一个扩展名为 lib 的文件。

动态库

步骤 10 – 要使用 dll 扩展名测试此文件,我们需要从文件 → 新建 → 项目创建一个新的基于 MFC 对话框的应用程序。

动态库

步骤 11 – 转到 MFCDynamicLib\Debug 文件夹并将 *.dll 和 *.lib 文件复制到 MFCLibTest 项目,如下面的快照所示。

动态库

步骤 12 – 要将 DLL 添加到当前项目,在主菜单上,单击项目 → 添加现有项目,然后选择 MFCDynamicLib.lib 文件。

步骤 13 – 设计您的对话框,如下面的快照所示。

动态库

步骤 14 – 为值类型为 double 的两个编辑控件添加值变量。

动态库

步骤 15 – 为静态文本控件添加值变量,位于对话框的末尾。

动态库

步骤 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 – 编译并执行上述代码后,您将看到以下输出。

动态库

步骤 21 – 在编辑字段中输入两个值,然后单击计算。您现在将看到从 DLL 计算后的结果。

动态库

觉得文章有用?

点个广告表达一下你的爱意吧 !😁