百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用Visual Studio来创建动态库/静态库,并加载

bigegpt 2024-10-04 13:53 6 浏览

使用Visual Studio来创建动态库

第一步新建一个控制台程序

第二步去掉SDL安全开发周期,以及选中创建DLL空项目

在资源管理器中添加.h和.cpp文件

在.h文件里可以写上函数的声明:

[cpp] view plain copy

  1. #pragma once //编译器命令 once头文件卫士
  2. extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
  3. */ int Add(int a,int b);

.cpp文件

[cpp] view plain copy

  1. #include "testdllh.h"
  2. int Add(int &a, int &b)
  3. {
  4. return a + b;
  5. }

这里不能直接编译,因为直接编译会生成dll,dll是无法直接运行的,所以这里我们选择生成:

上面表示生成成功,我们这里来调用dll试试:

代码如下:

[cpp] view plain copy

  1. #include "testdllh.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. int main(){
  5. HINSTANCE h = LoadLibraryA("ConsoleApplication10.dll"); //加载动态库
  6. typedef int(*FunPtr)(int a, int b);//定义函数指针来指向Dll动态库里的函数
  7. if (h == NULL)
  8. {
  9. FreeLibrary(h);
  10. printf("load dll error\n");
  11. }
  12. else{
  13. FunPtr funPtr = (FunPtr)GetProcAddress(h, "Add"); //获取动态库里指定函数文件偏移首地址
  14. if (funPtr != NULL)
  15. {
  16. int result = funPtr(3, 3); //调用函数
  17. printf("3 + 3 = %d \n", result);
  18. }
  19. else{
  20. printf("error add");
  21. }
  22. }
  23. printf("dd");
  24. getchar();
  25. }

运行结果:

下面来介绍一下上面用的三个函数:

LoadLibraryA、FreeLibrary、GetProcAddress函数是Windows为用户提供的用于载入动态库函数的接口

LoadLibraryA

函数原型:

[cpp] view plain copy

  1. HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
  2. _In_ LPCTSTR lpFileName:要加载的动态库路径

返回值:

成功返回引用模块句柄

FreeLibrary

函数原型:

[cpp] view plain copy

  1. WINBASEAPI
  2. BOOL
  3. WINAPI
  4. FreeLibrary(
  5. _In_ HMODULE hLibModule
  6. );
  7. _In_ HMODULE hLibModule; LoadLibrary返回的动态库模块句柄

返回值:成功返回true,否则返回false

GetProcAddress

函数原型:

[cpp] view plain copy

  1. FARPROC GetProcAddress(
  2. HMODULE hModule, // DLL模块句柄
  3. LPCSTR lpProcName // 函数名
  4. );

返回值:返回DLL模块文件中指定函数首地址/入口地址

除此之外也可以直接使用Visual Studio来包含DLL库,首先上面我们编译生成DLL的时候其实还有一个lib库文件:

将lib库文件copy到我们的项目路径下,在将dll文件根据你的系统位数copy到System32/SysWOW64目录下

在项目属性里直接引用:

在运行:

运行结果:

注意这里说一下为什么dll会生成lib文件?

Lib里面包含了dll的描述信息,比如函数符号表,偏移地址等信息,而非实际代码,所以我们在vside里面包含这个Lib文件,vs在编译器期间会自动读取lib配置信息,然后去系统指定动态库目录加载dll库!

编译器只会在编译时间用到lib文件来获取dll库里的某些信息,并不会被加载到程序当中!

静态库:

添加.h和.cpp

.h文件:

[cpp] view plain copy

  1. #pragma once //编译器命令 once头文件卫士
  2. extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
  3. */ int Add(int a, int b);

.cpp文件:

[cpp] view plain copy

  1. #include "libh.h"
  2. int Add(int &a, int &b)
  3. {
  4. return a + b;
  5. }

生成:

使用编译器命令comment加载:

[cpp] view plain copy

  1. #include "libh.h"
  2. #include <stdio.h>
  3. #pragma comment(lib,"ConsoleApplication12.lib") //加载静态库
  4. int main(){
  5. int result = Add(3, 3); //调用函数
  6. printf("3 + 3 = %d \n", result);
  7. printf("dd");
  8. getchar();
  9. }

运行结果:

相关推荐

有些人能留在你的心里,但不能留在你生活里。

有时候,你必须要明白,有些人能留在你的心里,但不能留在你生活里。Sometimes,youhavetorealize,Somepeoplecanstayinyourheart,...

Python学不会来打我(34)python函数爬取百度图片_附源码

随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...

软网推荐:图像变变变 一“软”见分晓

当我们仅需要改变一些图片的分辨率、裁减尺寸、添加水印、标注文本、更改图片颜色,或将一种图片转换为另一种格式时,总比较讨厌使用一些大型的图像处理软件,尤其是当尚未安装此类软件时,更是如此。实际上,只需一...

首款WP8.1图片搜索应用,搜照片得资料

首款WP8.1图片搜索应用,搜照片得资料出处:IT之家原创(天际)2014-11-1114:32:15评论WP之家报道,《反向图片搜索》(ReverseImageSearch)是Window...

分享一组美图(图片来自头条)(头条美女头像)

...

盗墓笔记电视剧精美海报 盗墓笔记电视剧全集高清种子下载

出身“老九门”世家的吴邪,因身为考古学家的父母在某次保护国家文物行动时被国外盗墓团伙杀害,吴家为保护吴邪安全将他送去德国读书,因而吴邪对“考古”事业有着与生俱来的兴趣。在一次护宝过程中他偶然获得一张...

微软调整Win11 24H2装机策略:6月起36款预装应用改为完整版

IT之家7月16日消息,微软公司今天(7月16日)发布公告,表示自今年6月更新开始,已默认更新Windows1124H2和WindowsServer2025系统中预装...

谷歌手把手教你成为谣言终结者 | 域外

刺猬公社出品,必属原创,严禁转载。合作事宜,请联系微信号:yunlugongby贾宸琰编译、整理11月23日,由谷歌新闻实验室(GoogleNewsLab)联合Bellingcat、DigD...

NAS 部署网盘资源搜索神器:全网资源一键搜,免费看剧听歌超爽!

还在为找不到想看的电影、电视剧、音乐而烦恼?还在各个网盘之间来回切换,浪费大量时间?今天就教你如何在NAS上部署aipan-netdisk-search,一款强大的网盘资源搜索神器,让你全网资源...

使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建

前言回顾在上一篇文章《搭建持久化的INFINIConsole与Easysearch容器环境》中,我们详细介绍了如何使用基础的dockerrun命令,手动启动和配置INFINICon...

为庆祝杜特尔特到访,这个国家宣布全国放假?

(观察者网讯)近日,一篇流传甚广的脸书推文称,为庆祝杜特尔特去年访问印度,印度宣布全国放假,并举办了街头集会以示欢迎。菲媒对此做出澄清,这则消息其实是“假新闻”。据《菲律宾世界日报》2日报道,该贴子...

一课译词:毛骨悚然(毛骨悚然的意思是?)

PhotobyMoosePhotosfromPexels“毛骨悚然”,汉语成语,意思是毛发竖起,脊梁骨发冷;形容恐惧惊骇的样子(withone'shairstandingonend...

Bing Overtakes Google in China&#39;s PC Search Market, Fueled by AI and Microsoft Ecosystem

ScreenshotofBingChinahomepageTMTPOST--Inastunningturnintheglobalsearchenginerace,Mic...

找图不求人!6个以图搜图的识图网站推荐

【本文由小黑盒作者@crystalz于03月08日发布,转载请标明出处!】前言以图搜图,专业说法叫“反向图片搜索引擎”,是专门用来搜索相似图片、原始图片或图片来源的方法。常用来寻找现有图片的原始发布出...

浏览器功能和“油管”有什么关联?为什么要下载

现在有没有一款插件可以实现全部的功能,同时占用又小呢,主题主要是网站的一个外观,而且插件则主要是实现wordpress网站的一些功能,它不仅仅可以定制网站的外观,还可以实现很多插件的功能,搭载chro...