首页 > 其他分享 >DLL动态库动态加载

DLL动态库动态加载

时间:2024-08-28 22:52:30浏览次数:8  
标签:调用 dll extern 动态 DLL 加载

库的调用方式

在VS下调用库有两种形式:
- 静态加载 
- 动态加载 
静态加载下,对应的头文件、DLL和LIB缺一不可,并且产生的EXE没有找到DLL文件的话就会导致“应用程序初始化失败”。 
动态加载下,只需要DLL,通过LoadLibrary()函数进行加载,但该方式对生成的dll的规范有一定的要求否则容易出错。 
下面主要介绍如何正常动态加载调用DLL。

动态加载

1. LoadLibrary是用来加载dll的,格式为

 HINSTANCE hdll;
 hdll=LoadLibrary("Image Enhance.dll");

调用成功后返回函数地址,否则返回0或NULL

[!NOTE] 错误原因和解决方法 
 1.路径不对(程序与dll要放在同一文件夹) 
 2.dll本身错误(依赖其他dll)借助depends.exe查看DLL依赖那些DLL 
2. GetProcAddress()是用来获取函数地址的,格式为:

 fun1 =(DLLfun)GetProcAddress(hdll, "sharpen"); 

调用成功后返回函数地址,否则返回0或NULL

[!NOTE] 错误原因和解决方法 
 当返回为0时,可以使用depends.exe工具来查看DLL里函数接口的具体的名字,可以发现会出现这种“?? 0sharpen @@QAE@XZ”奇怪的命名方式,软件上可以试着吧这个段替换原函数名测试一下,发现运行应该就正常了。 
 但是这种方式调用起来很不方式,其实这是创建的DLL库时,写的代码不够规范。 
 头文件中定义__declspec(dllexport) 时,要加上extern "C",从而规范dll的输出符合C标准,否则容易生成带@之类的字符串。extern"C"使得在C++中使用C编译方式成为可能。在“C++”下定义“C”函数,需要加extern“C”关键词。用extern "C"来指明该函数使用C编译方式。加上extern “C”后,输出函数的形式为"sharpen",符合预期标准。 
 其他标准可以参考:dll 导出函数名的那些事_vs dll函数名不一致-CSDN博客

 #define IMG_EXPORTS extern "C" __declspec(dllexport) 
//或者 extern "C" _declspec(dllimport) int calculateLineNum(CString filePath); 

3. FreeLibrary()是用来释放加载dll时占用的空间的,由于Loadlibrary()为对dll的显式加载(又叫动态加载),这种方式不会在用完dll后自动清理dll所占用的空间,所以我们要手动清除dll所占用的空间。否则会导致内存泄漏。调用格式如下:

FreeLibrary(hdll); 

参考链接:VS下动态库dll的显式调用(动态调用)_vs项目dll显式加载-CSDN博客

标签:调用,dll,extern,动态,DLL,加载
From: https://www.cnblogs.com/tangwc/p/18385669

相关文章

  • 学习爬虫day29-瑞数动态安全
    过瑞数的基本方法:自动化工具(非常NB,如:selenuim,playwrite),补环境,纯算;浏览器开无痕模式今天学习深圳大学的案例。1、解决无限dubugger:断点设置:一律不在此处暂定(debugger),注入js,重写debugger;方法一:控制台输入以下代码并执行let_Function=function;Function=function(s){if......
  • 静态代理ip与动态代理ip的区别与选择
    在当今软件开发领域,代理模式作为一种重要的设计模式,广泛应用于增强现有对象功能、控制访问权限以及实现远程调用等场景。本文旨在深入探讨静态代理与动态代理之间的核心区别,帮助开发者理解两者在实现机制、灵活性、性能表现及适用场景上的异同,进而指导在实际项目中如何根据具体......
  • 《黑神话:悟空》游戏崩溃提示“找不到bpladll.dll文件”该怎么修复系统?黑神话悟空游戏
    在玩《黑神话:悟空》时,如果游戏崩溃并提示“找不到bpladll.dll文件”,这确实让人烦恼。要修复系统,可以先尝试在可靠的网站下载该文件,放置到正确目录。也可以检查系统的相关组件是否完整,或者对游戏进行重新安装。本篇将为大家带来《黑神话:悟空》游戏崩溃提示“找不到bpladll.dll文......
  • 《星空》游戏崩溃弹窗提示“找不到pbvm115.dll文件”该怎么解决?星空游戏启动时闪退显
    在玩《星空》时,如果游戏崩溃并弹窗提示“找不到pbvm115.dll文件”,着实令人困扰。解决办法可以是在可靠的资源网站查找该文件并正确安装,或者对游戏进行完整性验证,也可检查相关驱动和运行库是否需要更新。本篇将为大家带来《星空》游戏崩溃弹窗提示“找不到pbvm115.dll文件”该怎......
  • 《绝地求生大逃杀》游戏启动时闪退弹窗“找不到devshl.dll”该怎么解决?PUBG游戏崩溃提
    在玩《绝地求生大逃杀》时,启动游戏却闪退并弹窗“找不到devshl.dll”,这十分让人头疼。要解决这个问题,可以尝试重新安装相关运行库,或者从可靠渠道获取该文件并正确放置到指定位置,也不排除是系统故障,需进行全面检查。本篇将为大家带来《绝地求生大逃杀》游戏启动时闪退弹窗“找不......
  • 动态调用vi和静态调用vi
    记一次被静态调用的vi打开运行卡死的问题:在一次上位机的调试中,主程序静态调用了子VI,提前打开子VI的情况下,运行主程序,使用相应功能时,子VI卡死无法操作。到网上查找相关问题后了解到这是labview中静态调用的一个弊端。同时,被静态调用的vi会随主程序启动而装载,从而增加资源消耗,影......
  • SpringBoot配置动态数据源 原理+实战
    若没空探究原理可直接跳转到“实现方式:注解+切面”目录数据源切换方法Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map<String,DataSource>。当JDBC操作数据库之时,会根据不同的key值选择不同的数据源。而这个key值可以放到方法的......
  • Java后端微服务架构下的配置动态刷新:Spring Cloud Bus
    Java后端微服务架构下的配置动态刷新:SpringCloudBus大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,服务的配置管理是一个挑战,尤其是当配置需要动态更新时。SpringCloudBus提供了一种基于消息总线的配置刷新机制,允许配置更改在服务......
  • OpenLayers如何设置图层闪烁效果并加载到地图上
        (本篇文章前提是了解openlayers具体使用方法)    给图层增加闪烁效果,具体的实现思路其实就是从图层的style入手,通过设置两个不同的style并结合定时器,最后加载在地图上即可。        当然,通过设置不同的style,不仅可以实现闪烁,还可以自定义实现,如大......
  • 探索微服务架构中的动态服务发现与调用:使用 Nacos 与 Spring Cloud OpenFeign 打造高
    1.背景在现代微服务架构中,服务之间的通信与协作是非常重要的。SpringCloudAlibaba提供了一套完整的微服务解决方案,其中包括Nacos用于服务注册与发现,OpenFeign用于声明式服务调用,SpringCloudLoadBalancer用于负载均衡。本文将通过一个简单的电商系统示例,演示如何......