使用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来创建动态库/静态库,并加载相关推荐

  1. 【Visual Studio】创建并使用静态库(.lib)

    创建并使用静态库[.lib] 参考文档 先决条件 创建静态库项目 向静态库添加类 向静态库添加类 备注 创建引用静态库的 C++ 控制台应用 在 Visual Studio 2019 中创建引用静态库 ...

  2. 让Visual Studio (VS)链接静态库(lib)及动态库(dll)文件的方法汇总

    本文为原创+转载,旨在总结一下VS链接动态链接库(dll)和静态链接库(lib)的方法. 在调试 Visual Studio 程序时,经常有一些动态链接库(即 dll 文件)需要加载到工程里,这样才能 ...

  3. 使用Visual studio中创建C++的静态链接库.lib文件附使用方式

    如何在Qt中使用静态库.lib(和VS一样,仅仅是操作方式略有差异) 如何在VS中创建.dll动态链接库.dll中函数与类的导出用__declspec(dllexport) 如何在Qt和VS中使用动态 ...

  4. visual studio 2017 创建 android 本地共享库(.so) 并从 C# android 项目中调用

    Developing Xamarin Android Native Applications ★★★★★ ★★★★ ★★★ ★★ ★ February 23, 2015 by Ankit Asthan ...

  5. visual studio编译boost1.73.0静态库32位和64位

    使用vs2015编译32位 REM 使用vs2015,如果vs2019将下面的vc14替换为vc142(特殊:--toolset=msvc-14.2 CALL bootstrap vc14 CALL ...

  6. autotools入门笔记(二)——创建和使用静态库、动态库

    带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...

  7. C++基于QT创建并使用静态库和动态库

    如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...

  8. 【OpenGL】一、Visual Studio 2019 创建 Windows 桌面程序 ( Visual Studio Installer 安装 C++ 桌面开发库 | 创建桌面程序 )

    文章目录 一.Visual Studio Installer 安装 C++ 桌面开发库 二.Visual Studio 2019 创建 Windows 桌面程序 之前曾使用 Visual Studio ...

  9. ActiViz(VTK的C#库)C#64位VTK如何在Visual Studio里创建RenderWindowControl控件

    Visual Studio17里只支持x86位控件拖拽,不支持x64.那怎样在64位的组件form窗口中放RenderWindowControl控件呢?下面我们就详细介绍一下在Visual Studi ...

最新文章

  1. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
  2. python访问mysql_python连接mysql
  3. POJ 3279 Fliptile
  4. iOS 算法的前世今生:算法原理、常用算法(一)排序算法
  5. python对象、引用
  6. CentOS 6.2 mini安装桌面环境
  7. 同一个按钮,实现排序
  8. GJB 标准化大纲(模板)
  9. JS代码压缩混淆工具使用说明
  10. plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
  11. 数据恢复关键技术与实战指南
  12. iec61508最新2020_什么是IEC 61508?
  13. 什么是跨域?浏览器为何禁止跨越请求?如何解决浏览器跨越问题
  14. 关于MySQL的between函数含头尾的问题
  15. win10关闭实时防护的步骤教程
  16. html+js画一颗心形,js画花构成心型
  17. 安装使用Discuz!破解模版插件提示“您安装的不是正版应用
  18. 测试opencl软件,OpenCL应用测试
  19. ArcGIS中建筑物图形简化工具和建筑物群聚合工具的应用
  20. 阿里云服务器vCPU和CPU有区别吗?

热门文章

  1. idea 自动加头部注释
  2. springmvc04跳转
  3. vivado unc paths are not supported
  4. 7 php 内存泄漏_php 大数组导致内存泄露问题
  5. mysql 分页拦截器_MyBatis 拦截器 (实现分页功能)
  6. springboot+activiti工作流mybatis冲突解决办法
  7. mysql grant show_【汇总】mysql常用操作【grant,show】
  8. 怎么把程序内部坐标转为屏幕坐标,如何将工作空间坐标转换为屏幕坐标?
  9. 华为服务器麒麟系统,麒麟云服务器
  10. 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...