VS2019-C++创建和调用DLL动态链接库(傻瓜式教程)

5 篇文章 1 订阅
2 篇文章 1 订阅

前言:查了好久好久网上的资料C++调用动态链接库,试了好多方法(直接创建DLL、空项目创建的)都多多少少有些问题,最后自己不断摸索着成功了,还是很开心的,接下来把最清晰的步骤分享给大家(C++新人,有什么说的不清楚的还请大佬们见谅)

第一步:创建C++空项目

第二步:创建头文件(.h)以及源文件(.cpp)

 

第三步:编写头文件(重点)

 图片显示部分是模板,名称可以自己起最重要的就是__declspec(dllexport)以及__declspec(dllimport)。一个是导出,一个是导入。

 为像我一样懒人们提供代码粘贴

#pragma once

#ifndef BHDLL_d
#define BHDLL_d

//宏定义导出
#ifdef BHDLL__//如果没有定义DLLH 就定义 DLLH __declspec(dllexport)
#define BHDLL __declspec(dllexport)//导出
#else
#define BHDLL __declspec(dllimport)//导入
#endif // DLLH__//如果没有定义DLLH 就定义 DLLH 

//编写代码区域

//导出函数

BHDLL int add(int a, int b);
BHDLL int sub(int a, int b);

//导出类

class BHDLL dllH
{
public:
  int mul(int a, int b);
  int div(int a, int b);
};

//以C语言方式导出函数:
extern "C"
{
  BHDLL int Cadd(int a, int b);
  BHDLL int Csub(int a, int b);
}



#endif

第四步:源文件实现头文件里面的方法

 为像我一样懒人们提供代码粘贴

#include "BH_dll.h"
#include <iostream>

using namespace std;

int add(int a, int b)
{
  return a + b;
}
int sub(int a, int b)
{
  return a - b;
}

int dllH::mul(int a, int b)
{
  return a * b;
}
int dllH::div(int a, int b)
{
  return a / b;
}

int Cadd(int a, int b)
{
  return a + b;
}
int Csub(int a, int b)
{
  return a - b;
}

第五步:配置解决平台X86/X64都可以,但是这个导出的DLL,用户引用的时候尽量和导出时的DLL平台一致

 第六步:配置类型-属性

 

 把配置类型变成动态库-应用-确定-生成解决方案。 

  第七步:完成动态链接库创建

在项目文件中可以找到dll,lib,,h文件,我们要的就是这三个

 

   第八步:创建新项目引用动态链接库

添加main函数

第九步:引用DLL

 在项目文件下创建两个文件夹,后续往里添加三个文件

 在include文件中添加刚才BH_DLL文件生成的.h文件

在lib文件中添加刚才BH_DLL文件生成的dll和lib文件

在项目文件夹下再次添加刚才BH_DLL文件生成的dll文件

如图所示

 

 配置新建项目的目录

配置之前一定要检查平台,一定要和生成DLL的平台一致然后再配置接下来的文件

 包含目录包含include

 

 库目录包含lib

 链接器-输入-附加依赖项包含lib文件名称

 

 

 应用-确认。

至此配置全部完成,接下来在main函数中引用

#include <iostream>

using namespace std;
#include <BH_dll.h>

int main()
{
  cout << add(1, 0) << endl;
  cout << sub(1, 0) << endl;

  dllH DH;
  cout << DH.div(4, 2) << endl;
  cout << DH.mul(4, 2) << endl;

  cout << Cadd(1, 0) << endl;
  cout << Csub(1, 0) << endl;
  getchar();
  return 0;
}

 完成!

有什么说的不对的地方还请大佬们在评论区留言,我看到了会改正,谢谢各位。

接下来会学习Qt调用C++DLL,学会了还会更新一期,如果哪位大佬知道捷径的话麻烦放个传送门在评论区呗,谢谢啦。

  • 69
    点赞
  • 325
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
动态链接库是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 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); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值