英文链接源链接 [12265]
contenteditable="true"

MFC - Libraries 介绍

库是一组功能,类或其他资源,可用于需要已经实现的实体的程序,而无需了解这些功能,类或资源是如何创建的或如何创建的功能。库使程序员可以轻松地使用由另一个人或公司创建的函数,类和资源等,并相信此外部源是可靠且高效的。与库相关的一些独特功能是-

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

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

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

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

您将在库中创建或包括两种功能:

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

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

您将在程序中处理的库分为两大类-

  • 静态库
  • 动态库

静态库

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

第1步-通过创建一个新的Win32 Project,我们来看一个简单的静态库示例。

静态库

Step 2 − On Application Wizard dialog box, choose the 静态库 option.

静态库

步骤3 -单击完成以继续。

静态库

步骤4 -在解决方案资源管理器中的项目上单击鼠标右键,然后从"添加"→"新建项目…"菜单options中添加头文件。

静态库

步骤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 -要使用库中的这些功能,让我们添加另一个基于File→New→Project的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 Project来研究一个简单的示例。

动态库

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

动态库

步骤3 -单击完成以继续。

第4步-在MFCDynamicLib.cpp文件中添加以下函数,并通过使用-公开其定义-

extern "C" _declspec(dllexport)

第5步-将_declspec(dllexport)修饰符用于将在DLL之外访问的每个函数。

//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;
   }
}

Step 6 − To create the DLL, on the main menu, click Build > Build MFCDynamicLib from the main menu.

动态库

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

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

第9步-请注意,已创建了一个具有dll扩展名的文件和另一个具有lib扩展名的文件。

动态库

步骤10 -要测试具有dll扩展名的文件,我们需要从File→New→Project创建一个基于MFC对话框的新应用程序。

动态库

步骤11 -转到MFC Dynamic Lib \Debug文件夹,然后将* .dll和* .lib文件复制到MFC LibTest项目中,如以下快照所示。

动态库

步骤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计算之后,您现在将看到输出。

动态库
点我分享笔记