C++程序在运行时调用动态链接库,实现逻辑扩展,有两种基本链接方式:隐式链接显式链接。下面就设立最基本情形实现上述链接。


创建DLL动态链接库

编辑头文件

mydll_3.h:

#pragma once
#define DLL_EXPORT_API extern "C" _declspec(dllexport) //Function
DLL_EXPORT_API int Add(int a, int b); //Class
class _declspec(dllexport) Math
{
public:
int Multiply(int a, int b);
};

stdafx.h:

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
// #pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
// Windows 头文件:
#include <windows.h> // TODO: 在此处引用程序需要的其他头文件

targetver.h:

#pragma once

// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。

// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 #include <SDKDDKVer.h>

编辑实现方法

mydll_3.cpp

// mydll_3.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h" #include "mydll_3.h" int Add(int a, int b)
{
return a + b;
} int Math::Multiply(int a, int b)
{
return a * b;
}

stdafx.cpp:

// stdafx.cpp : 只包括标准包含文件的源文件
// mydll_3.pch 将作为预编译标头
// stdafx.obj 将包含预编译类型信息 #include "stdafx.h" // TODO: 在 STDAFX.H 中引用任何所需的附加头文件,
//而不是在此文件中引用

检查配置

配置选择【动态库.dll】生成,即可得到对应动态链接库DLL对应的静态链接库LIB。一般的,静态库包含函数的入口信息、类声明等信息,动态库中包含具体实现方法。

创建可执行文件EXE

接下来创建exe来调用链接库中的信息。

编辑头文件

stdafx.h:

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
// #pragma once #include "targetver.h" #include <stdio.h>
#include <tchar.h> // TODO: 在此处引用程序需要的其他头文件

targetver.h:

#pragma once

// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。

// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 #include <SDKDDKVer.h>

编辑实现方法

mytest_3.cpp:

// mytest_3.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "mydll_3.h"
#include "windows.h" #pragma comment(lib,"mydll_3.lib") //意为告知编译器需要链接一个库,名叫 mydll_3.lib
//extern "C"_declspec(dllimport) int Add(int a, int b); //此处可有可无 // !!! 隐式链接 !!!
//TestDll.cpp
//void main()
//{
// int a;
// a = Add(8, 10);
// printf("结果为%d\n",a);
// Math m;
// printf("%d\n",m.Multiply(5, 3));
// system("pause");
//} // !!! 显式链接(动态) !!!
void main(void)
{
typedef int(*pAdd)(int a, int b);
HINSTANCE hDLL;
pAdd Add;
hDLL = LoadLibrary(_T("mydll_3.dll"));//加载动态链接库MyDll.dll文件;
Add = (pAdd)GetProcAddress(hDLL, "Add");
int a = Add(5, 8);
printf("结果为%d\n",a);
FreeLibrary(hDLL);//卸载myDll.dll文件;
system("pause");
}

stdafx.cpp:

// stdafx.cpp : 只包括标准包含文件的源文件
// mytest_3.pch 将作为预编译标头
// stdafx.obj 将包含预编译类型信息 #include "stdafx.h" // TODO: 在 STDAFX.H 中引用任何所需的附加头文件,
//而不是在此文件中引用

检查配置

确保动态库DLL和对应静态库LIB在开发目录下,配置选择【应用程序.exe】,生成即可!如果要发布,将可执行文件exe和动态链接库dll一起拷贝至目标文件夹(静态库lib不需要随exe拷贝)。

小结

有些配置如果是用Visual Studio来开发的话能在其选项中具体设置,比较方便,比如专门有【链接器】配置等。显式链接比较灵活,只需dll动态链接库就可以实现,而隐式链接则稍麻烦(静态库和对应动态库都需要),但如果大量使用链接库中的函数、类,就有它的优势。其中的细节很多,另开篇幅再谈,感谢阅读!

C++调用动态链接库DLL的隐式链接和显式链接基本方法小结的更多相关文章

  1. [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接

    转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...

  2. 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见

    静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...

  3. BCB如何编写,调用动态链接库DLL

    一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分.想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个 ...

  4. P/Invoke之C#调用动态链接库DLL

    本编所涉及到的工具以及框架: 1.Visual Studio 2022 2..net 6.0 P/Invok是什么? P/Invoke全称为Platform Invoke(平台调用),其实际上就是一种 ...

  5. Qt隐式共享与显式共享

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/69945878Qt中的很多C++类都使用了隐式数据共 ...

  6. CALayer的隐式动画和显式动画

    隐式事务 任何对于CALayer属性的修改,都是隐式事务,都会有动画效果.这样的事务会在run-loop中被提交. - (void)viewDidLoad { //初始化一个layer,添加到主视图 ...

  7. js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

     壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...

  8. selenium—隐式等待和显式等待

    一.隐式等待和显式等待的区别 隐式等待:是整个页面的等待.设置一个最长的等待时间,在规定时间内整个页面加载完成,则执行下一步,否则继续等待直到最长等待时间结束. 显式等待:是针对某个元素的等待.在设置 ...

  9. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  10. selenium(5)-解读强制等待,隐式等待,显式等待的区别

    背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...

随机推荐

  1. Java线程命名问题解决

    前言 网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下. 研究过程 默认命名 创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0 ...

  2. 好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!

    前言 今天大姚给大家分享一个好消息,GitHub Copilot 可以免费使用了!在此之前若开发者要使用 GitHub Copilot 需要付费订阅,每月订阅费用起步价为 10 美元,而经过验证的学生 ...

  3. [solon]Solon开发实战之权限认证

    本项目采用权限认证框架sa-token(sa-token-solon-plugin) pom.xml <!-- 鉴权--> <dependency> <groupId&g ...

  4. 更改linux文件/目录的权限、拥有者及用户组

    在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户.该文件用户可以修改该文件的拥有者及用户组,root用户可以修改任何文件的拥有者及用户组. 在Linux中,对于文件的权限(rwx), ...

  5. 谈谈 HTTP/2 的协议协商机制

    在过去的几个月里,我写了很多有关 HTTP/2 的文章,也做过好几场相关分享.我在向大家介绍 HTTP/2 的过程中,有一些问题经常会被问到.例如要部署 HTTP/2 一定要先升级到 HTTPS 么? ...

  6. Qt数据库应用19-图片转pdf

    一.前言 用户的需求真的是千奇百怪,刚做完不同页面横向纵向排版的需求,又来个需要图片转pdf的需求,提供静态函数直接使用. 经过这么些年的社会的毒打,我的原则是:用户是上帝和大爷,尽量站在用户的角度换 ...

  7. 编译Sophus报错: error: implicitly-declared 的参考解决方法

    一.问题描述 自己在编译Sophus时遇到如下错误: /home/wong/Datum/third_party/Sophus-1.0.0-template/Sophus-1.0.0/test/core ...

  8. 前后端分离模式下Java Web开发中的技术栈概图

    参考链接1:前后端的分离模式 参考链接2:浅谈前后端分离开发模式 参考链接3:前后端分离开发模式介绍

  9. C#中使用ping命令测试远程主机网络通信是否正常

    说明,使用ping工具 1.可以用来查询域名是否可以访问 2.可以用来查询域名对应的ip地址 如果远程服务器允许ping命令的前提下. 解决思路:主要使用了C#提供的Ping类,效率比较高,相应快 程 ...

  10. IDEA中基于SSM框架进行web开发部署项目到Tomcat时报错:Error:Cannot build artifact '******:war exploded' because it is included into a circular depency的解决办法

    在Idea中使用Maven创建父子工程,第一个Model的那个项目可以很好的运行,在创建一个Model运行时报这个错.原因是tomcat部署了多个Web项目,可能最开始是两个项目的配置文件混用用,最后 ...