mfc

Thư viện là một nhóm các hàm, lớp hoặc tài nguyên khác có thể được cung cấp cho các chương trình cần các thực thể đã được triển khai mà không cần biết các hàm, lớp hoặc tài nguyên này được tạo như thế nào hoặc chúng hoạt động như thế nào. Thư viện giúp lập trình viên dễ dàng sử dụng các chức năng, lớp và tài nguyên, v.v. do người khác hoặc công ty khác tạo ra và tin tưởng rằng nguồn bên ngoài này đáng tin cậy và hiệu quả. Một số tính năng độc đáo liên quan đến thư viện là –

  • Một thư viện được tạo và hoạt động giống như một chương trình bình thường thông thường, sử dụng các hàm hoặc các tài nguyên khác và giao tiếp với các chương trình khác.
  • Để thực hiện chức năng của nó, một thư viện chứa các chức năng mà các chương trình khác sẽ cần để hoàn thành chức năng của chúng.
  • Đồng thời, một thư viện có thể sử dụng một số chức năng mà các chương trình khác không cần đến.
  • Chương trình sử dụng thư viện, còn được gọi là máy khách của thư viện.

Có hai loại chức năng bạn sẽ tạo hoặc đưa vào thư viện của mình –

  • Chức năng bên trong là chức năng chỉ được sử dụng bởi chính thư viện và các máy khách của thư viện sẽ không cần truy cập vào các chức năng này.
  • Các chức năng bên ngoài là những chức năng có thể được truy cập bởi các máy khách của thư viện.

Có hai loại thư viện lớn mà bạn sẽ xử lý trong các chương trình của mình –

  • thư viện tĩnh
  • thư viện động

Thư vin tĩnh

Thư viện tĩnh là một tệp chứa các chức năng, lớp hoặc tài nguyên mà chương trình bên ngoài có thể sử dụng để bổ sung cho chức năng của nó. Để sử dụng một thư viện, lập trình viên phải tạo một liên kết đến nó. Dự án có thể là ứng dụng bảng điều khiển, ứng dụng Win32 hoặc ứng dụng MFC. Tệp thư viện có phần mở rộng lib.

Bước 1 – Chúng ta hãy xem xét một ví dụ đơn giản về thư viện tĩnh bằng cách tạo Dự án Win32 mới.

MFC - Thư viện

Bước 2 – Trên hộp thoại Trình hướng dẫn ứng dụng, chọn tùy chọn Thư viện tĩnh.

MFC - Thư viện

Bước 3 – Nhấp vào Kết thúc để tiếp tục.

MFC - Thư viện

Bước 4 – Nhấp chuột phải vào dự án trong trình khám phá giải pháp và thêm tệp tiêu đề từ tùy chọn menu Thêm → Mục mới….

MFC - Thư viện

Bước 5 – Nhập Calculator.h vào trường Tên và nhấp vào Thêm. Thêm mã sau vào tệp tiêu đề

#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_

Bước 6 – Thêm tệp nguồn (*.cpp) vào dự án.

MFC - Thư viện

Bước 7 – Nhập Calculator.cpp vào trường Tên và nhấp vào Thêm.

Bước 8 – Thêm đoạn mã sau vào tệp *.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;
   }
}

Bước 9 – Xây dựng thư viện này từ menu chính, bằng cách nhấp vào Build → Build MFCLib .

MFC - Thư viện

Bước 10 – Khi thư viện được xây dựng thành công, nó sẽ hiển thị thông báo trên.Bước 11 – Để sử dụng các chức năng này từ thư viện, chúng ta hãy thêm một ứng dụng hộp thoại MFC khác dựa trên Tệp → Mới → Dự án.

MFC - Thư viện

Bước 12 – Chuyển đến thư mục MFCLib\Debug và sao chép tệp tiêu đề và tệp *.lib vào dự án MFCLibTest như được minh họa trong ảnh chụp nhanh sau đây.

MFC - Thư viện

Bước 13 – Để thêm thư viện vào dự án hiện tại, trên menu chính, nhấp vào Dự án → Thêm mục hiện có và chọn MFCLib.lib.

Bước 14 – Thiết kế hộp thoại của bạn như trong ảnh chụp nhanh sau đây.

MFC - Thư viện

Bước 15 – Thêm biến giá trị cho cả hai điều khiển chỉnh sửa của loại giá trị kép.

MFC - Thư viện

Bước 16 – Thêm biến giá trị cho điều khiển Văn bản tĩnh, nằm ở cuối hộp thoại.

MFC - Thư viện

Để thêm chức năng từ thư viện, chúng ta cần đưa tệp tiêu đề vào tệp CMFCLibTestDlg.cpp.

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

Bước 18 – Đây là triển khai trình xử lý sự kiện nút.

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

Bước 19 – Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau.

MFC - Thư viện

Bước 20 – Nhập hai giá trị vào trường chỉnh sửa và nhấp vào Tính toán. Bây giờ bạn sẽ thấy kết quả sau khi tính toán từ thư viện.

MFC - Thư viện

Thư vin động

Win32 DLL là một thư viện có thể được cung cấp cho các chương trình chạy trên máy tính Microsoft Windows. Là một thư viện thông thường, nó được tạo từ các hàm và/hoặc các tài nguyên khác được nhóm trong một tệp.

Chữ viết tắt DLL là viết tắt của Thư viện liên kết động. Điều này có nghĩa là, trái ngược với thư viện tĩnh, DLL cho phép lập trình viên quyết định thời điểm và cách thức các ứng dụng khác sẽ được liên kết với loại thư viện này.

Ví dụ: một DLL cho phép các ứng dụng khác nhau sử dụng thư viện của nó khi chúng thấy phù hợp và cần thiết. Trên thực tế, các ứng dụng được tạo trên các môi trường lập trình khác nhau có thể sử dụng các chức năng hoặc tài nguyên được lưu trữ trong một DLL cụ thể. Vì lý do này, một ứng dụng liên kết động đến thư viện.

Bước 1 – Chúng ta hãy xem xét một ví dụ đơn giản bằng cách tạo Dự án Win32 mới.

MFC - Thư viện

Bước 2 – Trong phần Loại ứng dụng, nhấp vào nút radio DLL.

MFC - Thư viện

Bước 3 – Nhấp vào Kết thúc để tiếp tục.

Bước 4 – Thêm các chức năng sau vào tệp MFCDynamicLib.cpp và hiển thị các định nghĩa của nó bằng cách sử dụng –

extern "C" _declspec(dllexport)

Bước 5 – Sử dụng công cụ sửa đổi _declspec(dllexport) cho từng chức năng sẽ được truy cập bên ngoài 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;
   }
}

Bước 6 – Để tạo DLL, trên menu chính, nhấp vào Build > Build MFCDynamicLib từ menu chính.

MFC - Thư viện

Bước 7 – Khi DLL được tạo thành công, bạn sẽ thấy thông báo hiển thị trong cửa sổ đầu ra.

Bước 8 – Mở Windows Explorer và sau đó là thư mục Gỡ lỗi của dự án hiện tại.

Bước 9 – Lưu ý rằng một tệp có phần mở rộng dll và một tệp khác có phần mở rộng lib đã được tạo.

MFC - Thư viện

Bước 10 – Để kiểm tra tệp này với phần mở rộng dll, chúng ta cần tạo một ứng dụng dựa trên hộp thoại MFC mới từ Tệp → Mới → Dự án.

MFC - Thư viện

Bước 11 – Chuyển đến thư mục MFCDynamicLib\Debug và sao chép các tệp *.dll và *.lib vào dự án MFCLibTest như trong ảnh chụp nhanh sau đây.

MFC - Thư viện

Bước 12 – Để thêm DLL vào dự án hiện tại, trên menu chính, nhấp vào Dự án → Thêm mục hiện có, sau đó chọn tệp MFCDynamicLib.lib.

Bước 13 – Thiết kế hộp thoại của bạn như trong ảnh chụp nhanh sau đây.

MFC - Thư viện

Bước 14 – Thêm biến giá trị cho cả hai điều khiển chỉnh sửa của loại giá trị kép.

MFC - Thư viện

Bước 15 – Thêm biến giá trị cho điều khiển Văn bản tĩnh, nằm ở cuối hộp thoại.

MFC - Thư viện

Bước 17 – Trong dự án đang sử dụng DLL, mỗi chức năng sẽ được truy cập phải được khai báo bằng công cụ sửa đổi _declspec(dllimport).

Bước 18 – Thêm khai báo hàm sau vào tệp 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);

Bước 19 – Đây là triển khai trình xử lý sự kiện nút.

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

Bước 20 – Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau.

MFC - Thư viện

Bước 21 – Nhập hai giá trị vào trường chỉnh sửa và nhấp vào Tính toán. Bây giờ bạn sẽ thấy kết quả sau khi tính toán từ DLL.

MFC - Thư viện

Trả lời