我们可以使用 dumpbin 来查看 dll中导出了什么样的函数

dumpbin是什么命令呢,它是VS 自带的命令,可以用来查看DLL导出函数名

随便使用一个dll进行查看:命令:dumpbin /exports qrencoded.dll

随便使用一个exe进行查看:命令:dumpbin /imports .exe

如何去使用一个DLL呢?

c 下面使用导出的DLL


方法一:

#pragma comment(lib,"DLLTest.lib")  //加入.lib文件
//隐式加载  同时需要.lib  和 .dll文件 (这里的dll已经和源文件放在一起了)

方法二:
包含.lib文件的路径 ,否则可能找不到该.lib(不在原路径时,需要 附加库目录,如果同一路径可以不写

需要用到的.lib

需要包含的导出DLL 的头文件

运行结果:

源码:

//多字符集 不需要带L
//Unicode 需要带L

#include <stdio.h>
#include <windows.h>
#pragma region 方法一
//#include "dllTest.h"
//#pragma comment(lib,"DLLTest.lib")  //加入.lib文件
#pragma endregion//使用dll 方法一
int main()
{#pragma region  方法一  在配置的时候加入.lib 如上面的图//SayHello();
#pragma endregion#pragma region 方法二 DLL调用 里面函数使用char path[255] = { 0 };DWORD len = 0;//是否已经加载了这个DLLHMODULE hModule = GetModuleHandle(L"DLLTest.dll");if (NULL == hModule){//需要的时候调用DLLhModule = LoadLibrary(L"DLLTest.dll");if (NULL == hModule){printf("load library failed \n");getchar();return 1;}len = GetModuleFileName(hModule, path, 255);//printf 和 wprintf 分别对应 asiic 和 unicode 版本的输出函数,不同的编码要采用对应的输出形式。//unicodewprintf(L"%s\n", path);//asiic//printf("path:%s\n", path);}//不需要加 L""//使用DLL中的SayHello函数FARPROC fn = GetProcAddress(hModule, "SayHello");fn();//释放DLLFreeLibrary(hModule);
#pragma endregiongetchar();return 0;
}

c 语言 如何去 生成一个带参数 的 DLL呢?

源码


点击生成,即可看到到生成文件

查看导出的函数,但是并没有看到参数,只有函数名,这是C语言下的 DLL

.cpp文件下 去调用一个有参函数 的 DLL呢?

方法一:普通调用 有参函数的DLL 包含头 和 .lib文件

//如果用此方式去 调用 c语言写的DLL 时会报错,因为我们写的时候时.cpp文件 ,如果改成.c文件,就不会报错

解决办法:就是用 C语言 调用的方式 去调用 C 语言写的DLL,按照 C语言的规则 去调用

#include <stdio.h>
#include <windows.h>
#include "calc.h"
#pragma comment(lib,"DLLParametersTest.lib")int main()
{//方法一  普通调用
#if 1int a = 10;int b = 25;int c = 0;c = add1(a, b);printf("%d\n", c);double a2 = 1.0;double b2 = 2.5;double c2 = 0;c2 = add2(a2, b2);printf("%lf\n", c2);char str1[255] = "hello ";char str2[] = "world";int len = 0;len = add3(str1, 255, str2);printf("%s\n", str1);
#endifgetchar();return 0;
}

方法二:动态调用 DLL中的有参函数(动态方式 去 调用c语言写的DLL 不会报错)

#include <stdio.h>
#include <windows.h>
//定义几个函数指针  要与  我们在DLL 中的参数一样
typedef int (* ADD1)(int a, int b);
typedef double (* ADD2)(double a, double b);
typedef int (* ADD3)(char * str1, int size,char * str2);int main()
{#pragma region 方法二 动态调用dll中带参数的函数char path[255] = { 0 };DWORD length = 0;char str1[255] = "hello ";char str2[] = "world";HMODULE hModule =  GetModuleHandle(L"DLLParametersTest.dll");if (hModule == NULL){hModule =   LoadLibrary(L"DLLParametersTest.dll");if (hModule == NULL){printf("加载动态库失败\n");return 1;}length =  GetModuleFileName(hModule, LPWSTR(path), 255);wprintf(L"%s\n", path);}//强制转换为 ADD1类型ADD1 add1 = (ADD1)GetProcAddress(hModule, "add1");printf("%d\n", add1(10, 20));ADD2 add2 = (ADD2)GetProcAddress(hModule, "add2");printf("%.2f\n", add2(1.5, 2.3));ADD3 add3 = (ADD3)GetProcAddress(hModule, "add3");printf("%d\n", add3(str1, 255, str2));printf("%s\n", str1);FreeLibrary(hModule);
#pragma endregiongetchar();return 0;
}

c ++ 如何去 生成一个 DLL呢?

将上面生成 C语言DLL 的 .c文件 换成的 .cpp文件 即可生成 cpp下的DLL

c++下 查看DLL 的 样式,与C语言还是有很大的区别,c++时带不带参数的,C语言是带参数的(参数大小)

c ++ 去 调用 c++生成的 DLL呢?

如果使用第一种方法去调用 c++生成的DLL 是没有问题的,但是第二种方式 随用 随加载的方式 就会出问题
因为我们可以看到 在dumpbin文件下的 函数时乱的,这与GetProcAddress()函数需要加载的函数名不一样,这时我们就需要修改 函数名 后才能调用


#include <stdio.h>
#include <windows.h>#pragma region 方法一
//#include "calc.h"
//#pragma comment(lib,"DLLCPPTest.lib")
#pragma endregion
//初始化调用时不需要改变
//当cpp 调用cpp生成的DLL 时  需要将GetProcAddress 的参数2:改为c++的动态库函数名
typedef int (*ADD1)(int a, int b);
typedef double (*ADD2)(double a, double b);
typedef int (*ADD3)(char* str1, int size, char* str2);int main()
{#pragma region 方法一
#if 0int a = 10;int b = 25;int c = 0;c = add1(a, b);printf("%d\n", c);double a2 = 1.0;double b2 = 2.5;double c2 = 0;c2 = add2(a2, b2);printf("%lf\n", c2);char str1[255] = "hello ";char str2[] = "world";int len = 0;len = add3(str1, 255, str2);printf("%s\n", str1);
#endif
#pragma endregion#pragma region 方法二
#if 1 char path[255] = { 0 };DWORD length = 0;char str1[255] = "hello ";char str2[] = "world";HMODULE hModule = GetModuleHandle(L"DLLCPPTest.dll");if (hModule == NULL){hModule = LoadLibrary(L"DLLCPPTest.dll");if (hModule == NULL){printf("加载动态库失败\n");return 1;}length = GetModuleFileName(hModule, LPWSTR(path), 255);wprintf(L"%s\n", path);}//需要我们用 dumpbin 去查看  函数名  如果还写 一开始我们定义的add1 就会报错  ADD1 add1 = (ADD1)GetProcAddress(hModule, "?add1@@YAHHH@Z");printf("%d\n", add1(10, 20));ADD2 add2 = (ADD2)GetProcAddress(hModule, "?add2@@YANNN@Z");printf("%.2f\n", add2(1.5, 2.3));ADD3 add3 = (ADD3)GetProcAddress(hModule, "?add3@@YAHPADH0@Z");printf("%d\n", add3(str1, 255, str2));printf("%s\n", str1);FreeLibrary(hModule);
#endif
#pragma endregiongetchar();return 0;
}

c ++ 去 导出一个类 呢?
项目配置类型:dll(动态库类型)

一个是默认的构造函数 一个是析构函数 一个是自己定义的函数

c ++ 去 调用 一个 c++导出的类 呢?

c ++ 去 生成一个 c++导出复杂类 呢?
A公司定义一个标准
B公司 根据命名 去定义内容 供其他公司去调用

c ++ 去 调用 一个 c++导出的复杂类 呢?

__cdecl 与 __stdcall的区别

默认是: __cdecl
__stdcall : 标准调用 自己清理

_declspec(dllexport) int __cdecl add1(int a, int b);_declspec(dllexport) double __cdecl add2(double a, double b);_declspec(dllexport) int __cdecl add3(char* str1, int size, char* str2);

函数名需要加上调用规则

#include "calc.h"
#include <string.h>
int __cdecl  add1(int a, int b)
{return a + b;
}double __cdecl  add2(double a, double b)
{return a + b;
}int __cdecl  add3(char* str1, int size, char* str2)
{int total = strlen(str1) + strlen(str2);if (total >= size){return total;}strcat_s(str1, size, str2);return total;
}

参数后面时参数类型的大小,如果是给其他语言用的 必须使用__stdcall

通过def文件 规范 c++语言导出符号
c导出符号就是我们用dumpbin 看到的

编写一个.def文件 然后 导入到项目中


通过 C语言的形式生成 ,并且用 .def 去规范我们的 导出符号

c++ 加载dll 和 生成dll相关推荐

  1. 无法加载安装程序库 wbemupgd.dll

    当您在 Windows Server 2003 中使用"添加或删除程序"时收到错误消息"无法加载安装程序库 wbemupgd.dll" 要解决此问题,请按照下列 ...

  2. 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll

    java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...

  3. c 内存加载易语言dll,[求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败

    [求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 2011-10-6 13:32 13431 [求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 ...

  4. Python无法加载vc产生的DLL - 一种异常的情况

    Python无法加载vc产生的DLL - 一种异常的情况 本地调试时候一切正常,发布给客户就出现如下错误:无法导入DLL. 最后查明原因是:VC编译dll的设定差异导致. 有问题的设置: 改变后的设置 ...

  5. 基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块(卸载DLL、EXE和sys等加载)

    背景 对于内核层实现监控模块的加载,包括加载DLL模块.内核模块等.你也许会想到 HOOK 各种内核函数来实现.确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK.In ...

  6. 无法加载安装程序库wbemupgd.dll,或是找不到函数0cEntry。

    今天想给服务器添加Ftp组件,打开控制面板--添加或删除程序--添加或删除windows(组件)时,报无法加载安装程序库 wbemupgd.dll,或是找不到函数0cEntry.这个错误 解决办法:右 ...

  7. “无法加载安装程序库wbemupgd.dll,或是找不到函数OcEntry”解决办法

    打开"添加删除Windows组件"的时候,提示"无法加载安装程序库wbemupgd.dll,或是找不到函数OcEntry". 具体解决方法: 右键点击" ...

  8. PowerDesigner加载Sql文件生成数据模型,导出word文档

    PowerDesigner加载Sql文件生成数据模型,导出word / html(效果更好) 文档 1.打开PowerDesigner后 2.选择对应的数据库: 3.选择加载对应的sql文件 修改Po ...

  9. dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

  10. vs2019加载调试动态库dll文件

    创建一个hello world 的空项目 根据dll文件时多少位的就配多少,然后点击运行 将dll相关的头文件全部拷贝到测试项目中 将dll文件和lib也同时拷在测试文件的cpp同目录下 将编写dll ...

最新文章

  1. 嵌入式之NB-IoT开发与应用01【移动通信网络发展概述、NB-IoT应用案例、物联网生态系统-解决方案、智慧消防项目需求分析及系统设计】
  2. mysql5.1.6安装_mysql 5.1.6的安装启动
  3. 【JS 逆向百例】cnki 学术翻译 AES 加密分析
  4. 数据结构上机实践第八周项目6- 猴子选大王(数组版)
  5. ctb伺服驱动器说明书_伺服驱动器 CTB BK Servo
  6. git commit 参数详解 --amend
  7. 键盘快捷键 —— 有用
  8. TIKTOK视频:搬运视频技巧的这几点你知道吗?
  9. Spring boot带来的信息泄露
  10. Xshell4连接Linux后 win快捷键锁屏
  11. TPC(Transaction Processing Performance Council)-事务处理性能委员会
  12. 视频格式怎么转换,将mp4格式转为mov格式
  13. vue中使用echarts结合百度地图制作地图(引入百度地图、获取百度地图实例、设置百度地图)
  14. jQuery for Web Designers Web开发jQuery教程 Lynda课程中文字幕
  15. Allegro软件操作——绘制完成后检查内容,Gerberout
  16. Latex论文排版——图片
  17. kali安装步骤失败 选择并安装软件_PhotoShop CC2015软件下载+安装详细步骤
  18. SDI接口详解(先占个坑)
  19. 全国31省份双碳经济数据(2005-2020年)
  20. 下载Chrome扩展离线皮肤包crx文件方法

热门文章

  1. layer非常不错的web弹窗/层解决方案
  2. WebSocket实战之一
  3. 25岁社招进阿里,从电商到有赞新零售,他仅1年就打开了马云一直想做的新领域!...
  4. 物联网共享打印机系统是怎么做出来的?
  5. 初识小熊派——小熊派功能简介
  6. 运筹优化学习08:Repairing MIP infeasibility through local branching
  7. python入门笔记——类和对象③(案例:自动随机文字游戏——决战紫禁之巅)
  8. linux终端ppt,[转]TPP:linux终端下的ppt
  9. 如何下载哔哩哔哩里的视频
  10. 如何解开payload.bin获取包括Android内核在内的系统镜像文件?payload.bin解包教程