使用Visual Studio来创建动态库/静态库,并加载
使用Visual Studio来创建动态库
第一步新建一个控制台程序
第二步去掉SDL安全开发周期,以及选中创建DLL空项目
在资源管理器中添加.h和.cpp文件
在.h文件里可以写上函数的声明:
#pragma once //编译器命令 once头文件卫士extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。*/ int Add(int a,int b);
.cpp文件
#include "testdllh.h"
int Add(int &a, int &b)
{return a + b;
}
这里不能直接编译,因为直接编译会生成dll,dll是无法直接运行的,所以这里我们选择生成:
上面表示生成成功,我们这里来调用dll试试:
代码如下:
#include "testdllh.h"
#include <stdio.h>
#include <windows.h>
int main(){HINSTANCE h = LoadLibraryA("ConsoleApplication10.dll"); //加载动态库typedef int(*FunPtr)(int a, int b);//定义函数指针来指向Dll动态库里的函数 if (h == NULL){FreeLibrary(h);printf("load dll error\n");}else{FunPtr funPtr = (FunPtr)GetProcAddress(h, "Add"); //获取动态库里指定函数文件偏移首地址if (funPtr != NULL){int result = funPtr(3, 3); //调用函数printf("3 + 3 = %d \n", result);}else{printf("error add");}}printf("dd");getchar();}
运行结果:
下面来介绍一下上面用的三个函数:
LoadLibraryA、FreeLibrary、GetProcAddress函数是Windows为用户提供的用于载入动态库函数的接口
LoadLibraryA
函数原型:
HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);_In_ LPCTSTR lpFileName:要加载的动态库路径
返回值:
成功返回引用模块句柄
FreeLibrary
函数原型:
WINBASEAPI
BOOL
WINAPI
FreeLibrary(_In_ HMODULE hLibModule
);
_In_ HMODULE hLibModule; LoadLibrary返回的动态库模块句柄
返回值:成功返回true,否则返回false
GetProcAddress
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
返回值:返回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文件:
#pragma once //编译器命令 once头文件卫士extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。*/ int Add(int a, int b);
.cpp文件:
#include "libh.h"
int Add(int &a, int &b)
{return a + b;
}
生成:
使用编译器命令comment加载:
#include "libh.h"
#include <stdio.h>
#pragma comment(lib,"ConsoleApplication12.lib") //加载静态库
int main(){int result = Add(3, 3); //调用函数printf("3 + 3 = %d \n", result);printf("dd");getchar();}
运行结果:
相关连接:C/C++函数调用约定
使用Visual Studio来创建动态库/静态库,并加载相关推荐
- 【Visual Studio】创建并使用静态库(.lib)
创建并使用静态库[.lib] 参考文档 先决条件 创建静态库项目 向静态库添加类 向静态库添加类 备注 创建引用静态库的 C++ 控制台应用 在 Visual Studio 2019 中创建引用静态库 ...
- 让Visual Studio (VS)链接静态库(lib)及动态库(dll)文件的方法汇总
本文为原创+转载,旨在总结一下VS链接动态链接库(dll)和静态链接库(lib)的方法. 在调试 Visual Studio 程序时,经常有一些动态链接库(即 dll 文件)需要加载到工程里,这样才能 ...
- 使用Visual studio中创建C++的静态链接库.lib文件附使用方式
如何在Qt中使用静态库.lib(和VS一样,仅仅是操作方式略有差异) 如何在VS中创建.dll动态链接库.dll中函数与类的导出用__declspec(dllexport) 如何在Qt和VS中使用动态 ...
- visual studio 2017 创建 android 本地共享库(.so) 并从 C# android 项目中调用
Developing Xamarin Android Native Applications ★★★★★ ★★★★ ★★★ ★★ ★ February 23, 2015 by Ankit Asthan ...
- visual studio编译boost1.73.0静态库32位和64位
使用vs2015编译32位 REM 使用vs2015,如果vs2019将下面的vc14替换为vc142(特殊:--toolset=msvc-14.2 CALL bootstrap vc14 CALL ...
- autotools入门笔记(二)——创建和使用静态库、动态库
带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...
- C++基于QT创建并使用静态库和动态库
如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...
- 【OpenGL】一、Visual Studio 2019 创建 Windows 桌面程序 ( Visual Studio Installer 安装 C++ 桌面开发库 | 创建桌面程序 )
文章目录 一.Visual Studio Installer 安装 C++ 桌面开发库 二.Visual Studio 2019 创建 Windows 桌面程序 之前曾使用 Visual Studio ...
- ActiViz(VTK的C#库)C#64位VTK如何在Visual Studio里创建RenderWindowControl控件
Visual Studio17里只支持x86位控件拖拽,不支持x64.那怎样在64位的组件form窗口中放RenderWindowControl控件呢?下面我们就详细介绍一下在Visual Studi ...
最新文章
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
- python访问mysql_python连接mysql
- POJ 3279 Fliptile
- iOS 算法的前世今生:算法原理、常用算法(一)排序算法
- python对象、引用
- CentOS 6.2 mini安装桌面环境
- 同一个按钮,实现排序
- GJB 标准化大纲(模板)
- JS代码压缩混淆工具使用说明
- plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
- 数据恢复关键技术与实战指南
- iec61508最新2020_什么是IEC 61508?
- 什么是跨域?浏览器为何禁止跨越请求?如何解决浏览器跨越问题
- 关于MySQL的between函数含头尾的问题
- win10关闭实时防护的步骤教程
- html+js画一颗心形,js画花构成心型
- 安装使用Discuz!破解模版插件提示“您安装的不是正版应用
- 测试opencl软件,OpenCL应用测试
- ArcGIS中建筑物图形简化工具和建筑物群聚合工具的应用
- 阿里云服务器vCPU和CPU有区别吗?
热门文章
- idea 自动加头部注释
- springmvc04跳转
- vivado unc paths are not supported
- 7 php 内存泄漏_php 大数组导致内存泄露问题
- mysql 分页拦截器_MyBatis 拦截器 (实现分页功能)
- springboot+activiti工作流mybatis冲突解决办法
- mysql grant show_【汇总】mysql常用操作【grant,show】
- 怎么把程序内部坐标转为屏幕坐标,如何将工作空间坐标转换为屏幕坐标?
- 华为服务器麒麟系统,麒麟云服务器
- 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...