MFC - Thư viện
A librarylà một nhóm các chức năng, lớp hoặc cá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 chức năng, lớp hoặc tài nguyên này được tạo ra 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 hàm, lớp và tài nguyên, v.v. do một người 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à:
Thư viện được tạo ra và hoạt động giống như một chương trình thông thường bình 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, 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.
Chương trình sử dụng thư viện, còn được gọi là các máy khách của thư viện.
Có hai loại hàm bạn sẽ tạo hoặc đưa vào thư viện của mình -
Một chức năng nội bộ chỉ được sử dụng bởi chính thư viện và khách hàng của thư viện sẽ không cần quyề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ư viện tĩnh
A static librarylà một tệp chứa các hàm, lớp hoặc tài nguyên mà chương trình bên ngoài có thể sử dụng để bổ sung chức năng của nó. Để sử dụng một thư viện, người lập trình phải tạo một liên kết đến nó. Dự án có thể là một ứng dụng console, Win32 hoặc một ứng dụng MFC. Tệp thư viện có phần mở rộng là lib.
Step 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 một Dự án Win32 mới.
Step 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.
Step 3 - Nhấn Hoàn tất để tiếp tục.
Step 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….
Step 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_
Step 6 - Thêm tệp nguồn (* .cpp) trong dự án.
Step 7 - Nhập Calculator.cpp vào trường Tên và nhấp vào Thêm.
Step 8 - Thêm 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;
}
}
Step 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.
Step 10 - Khi xây dựng thành công thư viện sẽ hiển thị thông báo trên.
Step 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 File → New → Project.
Step 12 - Đi đế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 hiển thị trong ảnh chụp nhanh sau đây.
Step 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.
Step 14 - Thiết kế hộp thoại của bạn như thể hiện trong ảnh chụp sau.
Step 15 - Thêm biến giá trị cho cả hai điều khiển chỉnh sửa kiểu giá trị kép.
Step 16 - Thêm biến giá trị cho điều khiển Văn bản tĩnh, ở cuối hộp thoại.
Step 17 - Thêm trình xử lý sự kiện cho nút Tính toá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"
Step 18 - Đây là phần thực hiện của button event handler.
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);
}
Step 19 - Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả như sau.
Step 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.
Thư viện độ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 bình thường, nó được tạo bởi các hàm và / hoặc các tài nguyên khác được nhóm lại 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 khi nào và như thế nào 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 với thư viện.
Step 1 - Chúng ta hãy xem xét một ví dụ đơn giản bằng cách tạo một Dự án Win32 mới.
Step 2 - Trong phần Loại ứng dụng, nhấp vào nút radio DLL.
Step 3 - Nhấn Hoàn tất để tiếp tục.
Step 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)
Step 5 - Sử dụng công cụ sửa đổi _declspec (dllexport) cho mỗi 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;
}
}
Step 6 - Để tạo DLL, trên menu chính, nhấp vào Build > Build MFCDynamicLib từ menu chính.
Step 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.
Step 8 - Mở Windows Explorer và sau đó là thư mục Gỡ lỗi của dự án hiện tại.
Step 9 - Chú ý 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.
Step 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.
Step 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ư được hiển thị trong ảnh chụp nhanh sau.
Step 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.
Step 13 - Thiết kế hộp thoại của bạn như thể hiện trong ảnh chụp sau.
Step 14 - Thêm biến giá trị cho cả hai điều khiển chỉnh sửa kiểu giá trị kép.
Step 15 - Thêm biến giá trị cho điều khiển Văn bản tĩnh, ở cuối hộp thoại.
Step 16 - Thêm trình xử lý sự kiện cho nút Tính toán.
Step 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 sửa đổi _declspec (dllimport).
Step 18 - Thêm khai báo hàm sau trong 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);
Step 19 - Đây là phần thực hiện của button event handler.
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);
}
Step 20 - Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả như sau.
Step 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.