创建和使用 C/C++ DLL动态链接库(1)

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

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态链接库是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 Windows 平台上,动态链接库采用 .dll 后缀名,而在 Linux 平台上则采用 .so 后缀名。在本文中,我们将介绍如何使用 MFC 调用 C 语言编写的动态链接库。 # 创建动态链接库 在 Windows 平台上,可以使用 Visual Studio 创建动态链接库。下面是一个简单的示例: ```c // mydll.h #ifndef MYDLL_H #define MYDLL_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b); #ifdef __cplusplus } #endif #endif // MYDLL_H // mydll.c #include "mydll.h" int add(int a, int b) { return a + b; } ``` 这个动态链接库包含一个 add 函数,可以对两个整数求和。 # 调用动态链接库 在 MFC 项目中调用动态链接库,需要进行以下几个步骤: 1. 定义一个函数指针类型,指向动态链接库中的函数。 ```c++ typedef int (*AddFunc)(int, int); ``` 2. 加载动态链接库。 ```c++ HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } ``` 3. 获取动态链接库中的函数地址。 ```c++ AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } ``` 4. 调用动态链接库中的函数。 ```c++ int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); ``` 5. 卸载动态链接库。 ```c++ FreeLibrary(hinstLib); ``` 完整的 MFC 代码示例: ```c++ typedef int (*AddFunc)(int, int); void CMyDlg::OnButton1() { HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); FreeLibrary(hinstLib); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值