参考:
//blog.csdn.net/luoyu510183/article/details/93666808
//blog.csdn.net/SonnAdolf/article/details/80339070
//blog.csdn.net/blade1080/article/details/81538384

Loadlibrary方式不在需要.lib库,当我们编译动态库的时候,会生成两个文件,.dll和.lib ,lib和静态库不同,只是有一些函符号,真正的实现在dll里。所以说,编译动态库时生成的lib是可以不需要的。但是,如果你不采用Loadlibrary的方式,那么两个文件都需要。

下面写了一个小例子:

1、编译库

我们先编译一个库文件,然后采用Loadlibrary的方式调用。
mydll.h

#pragma once
#include <windows.h>
#include <iostream>
using namespace std;#define MY_DLL_EXPORTS#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endifextern "C" MY_DLL_API int open_device(int handle);extern "C" MY_DLL_API int open_seesion(int hseion);

mydll.cpp

#include "mydll.h"extern "C" MY_DLL_API int  open_device(int handle)
{cout << "display func: open_device,"<<"handle is:"<< handle << endl;return 0;
}extern "C" MY_DLL_API int  open_seesion(int session)
{cout << "display func: open_seesion,"<<"session is:"<< session << endl;return 0;
}

默认的调用方式为:

属性->C/C+±>高级-> 调用约定: __cdecl (/Gd)


编译完后,我们用dumpbin看一下导出符号:


说明库里边已经把函数导出来了,使用loadlibrary的时候需要和导出名字对应上。

2、编译调用app

注意,你的应用程序和库文件要在同一个目录下。

Loadlibrary_test.cpp

#include <iostream>
#include <Windows.h>
#include "mydll.h"using namespace std;int main(void)
{HMODULE hMod = LoadLibrary(TEXT("lib_dll.dll"));//载入dll,TEXT为了兼容格式,防止报类型错误if (hMod == nullptr) {cout << "load dll error!" << endl;return -1;}typedef int(* Open_Device)(int);typedef int(* Open_Seesion)(int);Open_Device opendev = (Open_Device)GetProcAddress(hMod, "open_device");//获取函数地址if (opendev == nullptr){cout << "load open_device error!" << endl;return -1;}int rv = opendev(1);//通过函数指针调用函数Open_Seesion openses = (Open_Seesion)GetProcAddress(hMod, "open_seesion");if (openses == nullptr){cout << "load open_session error!" << endl;return -1;}rv = openses(2);//通过函数指针调用函数FreeLibrary(hMod);system("pause");return 0;
}

现象:

3、备注

顺便再讲下关于调用约定和函数符号的关系,即_stdcall, _cdecl.还有就是extern "c"对函数名符号的影响。

extern “C” + _stdcall,函数导出符号为 : _+函数名+@+传参字节数

由于_stdcall是被调用方清理堆栈,所以函数符号里面包含了传参的信息

extern “C” + _cdecl,函数导出符号为 : 函数名

由于_cdecl是调用方清理堆栈,所以只需要函数名就可以

不使用extern的情况下,是C++的导出方式,函数符号如下:
:?+函数名+@@YG+返回类型+参数1类型…+@Z
如果是_cdecl @YG变为@YA
如果没有参数即参数为void,则以Z结尾,例如:
: ?+函数名+@@YA+返回类型+XZ
以上 X表示 void类型,H表示int参数类型

配置属性里边如果生成调试信息选否,到出库里就会只有函数名

VS2015采用loadlibrary方式调用dll库相关推荐

  1. vs2015开发python_VS2015 编写C++ DLL库及C++、 C#、python 调用

    VS2015生成c++dll C++ 程序调用 dll C# 程序调用 dll 1. VS2015 生成C++dll 可以有两种方法通过_declspec(dllexport) extern &quo ...

  2. JNI的方式调用DLL(SO)(上)

    最近有个项目要调用原有的DLL文件,本来准备使用JNA,可是客户不同意,非要使用JNI的方式.万般无奈之下,只能重新使用JNI,现将JAVA调用动态链接库的一般方法总结如下. JNI是Java Nat ...

  3. python如何调用dll库中的函数_Python调用dll库接口-ctypes方法

    背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...

  4. java library jna_Java JNA 调用dll库

    JNA JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JN ...

  5. Electron9.x_Vue_调用DLL库

    本文主要介绍在 Electron9.x 中,使用ffi-napi,ref-array-napi,ref-napi 加载 Windows 动态链接库,并在Vue 渲染进程中使用.使用过程中会遇到一系列的 ...

  6. 基于C#进行AutoCAD二次开发初探(一)——调用dll库

    自己是测绘行业,不可避免要跟CAD打交道.因为之前用C#写了一个小软件,希望能够自动调用CAD画等高线,所以想基于C#进行Autocad的二次开发.但自己在此方面真的是零基础菜鸟一只.搜了大量的资料, ...

  7. dll放在unity哪个文件夹下_Unity中调用DLL库

    DLL -- Dynamic Link Library(动态链接库文件),这里以Window平台为例. Unity支持的两种语言生成的DLL库(C++.C#),这里以C#为例,C++网上可以搜索很详细 ...

  8. LoadLibrary()动态调用dll失败,GetLastError()返回126

    问题: 写项目时要调用a.dll,a.dll依赖a1.dll,路径确保无误,dll也在对应的目录,依赖dll也在,使用LoadLibrary()加载时会失败,用GetLastError()返回126. ...

  9. python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...

    在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...

最新文章

  1. R语言ggplot2可视化将两个dataframe可视化的结果组合在一起实战:combining two plots from different data.frames
  2. 人工智能 机器学习系列 2:代价函数
  3. Winform程序窗体间的跳转
  4. js ==与===区别(两个等号与三个等号)
  5. IE访问历史记录恢复工具pasco
  6. php laravel框架 rce分析 cve-2018-15133
  7. redis源码之sds
  8. 第五周实践项目6 数制转换(栈)
  9. SpringBoot集成Cache缓存(Redis缓存,RedisTemplate方式)
  10. Pytorch 配置 Tensorboard 可视化学习(一)
  11. 鸡头稳如云台_三轴增稳云台是怎么让相机、手机「稳如鸡头」的?
  12. 在Azure平台上使用托管卡进行身份认证
  13. c#解析json字符串数组_在C#中解析Json字符串
  14. 如何提升数据化管理效率
  15. taobao.itemprops.get( 获取标准商品类目属性 )
  16. Win11调整分区大小的方法有哪些?
  17. 内核线程ksoftirqd
  18. 网络测速全解析之一:自定义View基础知识(八)
  19. 无法打开“kdiff3”,因为Apple无法检查其是否包含恶意软件。
  20. 红通告小程序_博主招募新选择,“红通告”助力红人推广

热门文章

  1. VirtualBox调整动态磁盘大小
  2. asp.net IE10 下的bug
  3. TCP 第三次握手失败
  4. 学不可以已--我一年Java之路的回顾,反思以及展望(上)
  5. [Java]-zip包的使用
  6. 遇到不认识的字怎么键盘输入
  7. 如何升级python的包_Python的包怎么升级
  8. java 算法蜗牛爬楼
  9. python象棋棋盘麦粒问题_Python求解“棋盘米粒倍增”问题
  10. 电脑不能上网,但能登QQ