(1)动态链接库介绍
DLL文件(动态链接库)是一种包含其他程序使用的数据和指令,并可以在需要时调用的文件类型。DLL 文件允许多个程序同时共享函数和类。与可执行程序不同,DLL 文件不能直接运行,而必须由其他程序调用。
“动态”一词用于说明数据在内存中并不总是可用的,只有在程序主动调用时才会使用。DLL 文件允许将程序分成多个独立的组件,然后可以添加或删除这些组件以包含或排除某些功能。这非常有用,因为它降低了内存的使用,因为程序不需要一次加载所有内容。
例如,在 Windows 中,Kernel32.dll 文件处理内存管理、输入/输出操作和中断。
DLL 最重要的特性,它在运行时加载,当应用程序请求 DLL 功能时,加载时间非常短。
在本文中,将实现如何在 C++ 中创建 DLL 以及如何通过 C++ 应用程序使用此 DLL。
(2)C 和 C++
Microsoft Visual C++ 为标准 C++ 提供了多个扩展,允许直接在 C++ 代码中将函数和类指定为导入或导出。这些扩展在函数或类声明之前使用属性__declspec
。
请注意,当从 C++ 访问 C 函数或类时,函数必须在 C++ 代码中声明为 extern “C”
,以通知编译器不要破坏函数或类,而是使用“C”链接。因为C++支持函数重载,我们可以声明多个同名不同参数的函数。然后,我们需要向编译器提供有关函数名称的附加信息,以避免未定义的引用错误或链接错误(因为 C 不支持函数重载)。
这里的解决方案是在我们的 C++ 程序中指定 extern “C”
。当编译器找到一个 extern “C”
块时,它确保函数名没有被破坏——编译器发出一个名称不变的二进制文件,就像“C”编译器所做的那样。这些附加信息使我们能够避免二进制代码中的链接问题和冲突。
(3)在 C++ 中创建 DLL 的步骤
在这里,我将描述如何使用Visual Studio在 C++ 中创建一个 DLL 项目。
-
1.打开visual studio,点击菜单栏上的新建项目。见下图。
-
2.选择新项目后,会打开一个新的对话框,这里选择项目类型Win32,并为DLL项目命名。
-
3.在 Win32 应用程序向导对话框的概述页面上,选择下一步按钮。单击下一步按钮后,将打开一个新窗口。这里是应用程序设置窗口,我们将选择应用程序的类型,然后单击完成按钮创建 DLL 项目。
-
4.创建 DLL 项目后,您必须根据您的要求添加头文件和源文件。这里我只添加了一个头文件(Calculation.h)。
-
5.创建头文件后,根据要求编写所需的内容。在这里,我正在创建一个执行一些基本算术运算(如加法、减法和乘法)的库。
//Calculation.h
#pragma once
#ifdef CALCULATIONDLL_EXPORTS
#define CALCULATION_API __declspec(dllexport)
#else
#define CALCULATION_API __declspec(dllimport)
#endif
class CALCULATION_API CalculationApi
{
public:
void Addition(void);
void Subtraction(void);
void Multiply(void);
};
注意:当您创建了一个 DLL 项目后,会自动在 DLL 项目的预处理器符号中定义 PROJECTNAME_EXPORTS
。在此示例中,CALCULATIONDLL_EXPORTS
是在构建 CALCULATIONDLL DLL
项目时定义的。(如果预处理中没有这个宏,添加CALCULATIONDLL_EXPORTS即可)
- 6.现在是在源文件中定义类成员函数的时候了。在这里,我在
CalculationDll.cpp
文件中定义了所有成员函数。
// CalculationDll.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include"Calculation.h"
#include<iostream>
using namespace std;
void CalculationApi::Addition(void)
{
int x = 0;
int y = 0;
cout << "Enter the numbers for add" << endl;
cin >> x >> y;
cout << (x + y)<<endl;
}
void CalculationApi::Subtraction(void)
{
int x = 0;
int y = 0;
cout << "Enter the numbers for sub" << endl;
cin >> x >> y;
cout << (x - y) << endl;
}
void CalculationApi::Multiply(void)
{
int x = 0;
int y = 0;
cout << "Enter the numbers for multiply" << endl;
cin >> x >> y;
cout << (x * y) << endl;
}
- 7.现在将源文件和头文件添加到 DLL 项目中,创建 DLL 和 lib 只需构建 DLL 项目。如果一切正常并且您的 DLL 项目可以完美编译而没有任何错误,那么将生成一个
DLL 和 .lib
文件。
(4)创建 C++ 应用程序的步骤
在这里,我正在创建一个将使用创建的 DLL 的 C++ 应用程序。
-
1.单击菜单栏创建一个新的 c++ 应用程序项目,该项目使用我刚刚创建的 DLL。
-
2.选择新项目后会打开一个新对话框,这里选择项目类型
Win32 Console Application
并为 App 项目命名。
-
3.在 Win32 应用程序向导对话框的概述页面上,选择下一步按钮。单击下一步按钮后,将打开一个新窗口。这里是
Application setting
窗口,我们将选择应用程序的类型,点击finish按钮创建c++Console Application
工程。
现在您的 C++ 应用程序项目已准备好使用 DLL(动态链接库)。
(5)如何将 DLL 与 C++ 应用程序链接
在这里,我将讨论将 DLL 项目与 C++ 应用程序项目链接的简单步骤。
-
1.当我们创建了 DLL 和应用程序之后,我们必须将 DLL 引用到应用程序,这使得应用程序能够根据需要使用 DLL 函数。为此,在解决方案资源管理器中的 CalculationApplication 项目下,选择引用项。在菜单栏上,选择“项目”、“添加引用”。
-
2.当您单击添加新引用时,将打开一个对话框,其中包含您可以引用的库列表。您只需单击所需库的检查按钮即可。这里对话框中只显示一个库。
-
3.现在您创建的库与创建的应用程序链接,但在应用程序中使用 DLL 之前,您必须添加 DLL 头文件。有两种方法可以完成此任务,一种方法是将 DLL 头文件复制到您的应用程序项目中,但这可能会导致一个副本中的更改不会反映在另一个副本中。这不是一种安全的方式,所以我们遵循第二种方式,我们只引用DLL头文件来给出应用程序项目包含的目录路径中原始DLL头文件的路径。
(6)结果查看
给出 DLL 头文件的路径后,您就可以在应用程序中包含 DLL 头文件。现在是时候根据要求访问 DLL 的功能了。
在下面的应用程序代码中,我只是调用 DLL 计算函数来执行加减乘法。
// CalculationApplication.cpp :
#include "stdafx.h"
#include"Calculation.h"
int main(int argc, char *argv[])
{
CalculationApi obj;
obj.Addition();
obj.Subtraction();
obj.Multiply();
return 0;
}