最近在看dll的代码。由于是初学者就找了一些资料来看,这样可以很快地理解dllmain的工作方式。 系统是在什么时候调用DllMain函数的呢?静态链接时,或动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。DllMain的第三个参数fdwReason指明了系统调用Dll的原因,它可能是DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_THREAD_ATTACH和DLL_THREAD_DETACH。以下从这四种情况来分析系统何时调用了DllMain。 1.DLL_PROCESS_ATTACH 大家都知道,一个程序要调用Dll里的函数,首先要先把DLL文件映射到进程的地址空间。要把一个DLL文件映射到进程的地址空间,有两种方法:静态链接和动态链接的LoadLibrary或者LoadLibraryEx。 当一个DLL文件被映射到进程的地址空间时,系统调用该DLL的DllMain函数,传递的fdwReason参数为DLL_PROCESS_ATTACH。这种调用只会发生在第一次映射时。如果同一个进程后来为已经映射进来的DLL再次调用LoadLibrary或者LoadLibraryEx,操作系统只会增加DLL的使用次数,它不会再用DLL_PROCESS_ATTACH调用DLL的DllMain函数。不同进程用LoadLibrary同一个DLL时,每个进程的第一次映射都会用DLL_PROCESS_ATTACH调用DLL的DllMain函数。 可参考DllMainTest的DLL_PROCESS_ATTACH_Test函数。 2. DLL_PROCESS_DETACH 当DLL被从进程的地址空间解除映射时,系统调用了它的DllMain,传递的fdwReason 值是DLL_PROCESS_DETACH。当DLL处理该值时,它应该执行进程相关的清理工作。 那么什么时候DLL被从进程的地址空间解除映射呢?两种情况: ◆FreeLibrary解除DLL映射(有几个LoadLibrary,就要有几个FreeLibrary) ◆进程结束而解除DLL映射,当然实在进程结束前还没有这个解除DLL的映射的情况。(如果进程的终结是因为调用了TerminateProcess,系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。这就意味着DLL在进程结束前没有机会执行任何清理工作。) 注意:当用DLL_PROCESS_ATTACH调用DLL的DllMain函数时,如果返回FALSE,说明没有初始化成功,系统仍会用DLL_PROCESS_DETACH调用DLL的DllMain函数。因此,必须确保没有清理那些没有成功初始化的东西。 可参考DllMainTest的DLL_PROCESS_DETACH_Test函数。 3. DLL_THREAD_ATTACH 当进程创建一线程时,系统查看当前映射到进程地址空间中的所有DLL文件映像,并用值DLL_THREAD_ATTACH调用DLL的DllMain函数。 新创建的线程负责执行这次的DLL的DllMain函数,只有当所有的DLL都处理完这一通知后,系统才允许线程开始执行它的线程函数。 注意跟DLL_PROCESS_ATTACH的区别,我们在前面说过,第n(n>=2)次以后地把DLL映像文件映射到进程的地址空间时,是不再用DLL_PROCESS_ATTACH调用DllMain的。而DLL_THREAD_ATTACH不同,进程中的每次建立线程,都会用值DLL_THREAD_ATTACH调用DllMain函数,哪怕是线程中建立线程也一样。 4. DLL_THREAD_DETACH 如果线程调用了ExitThread来结束线程(线程函数返回时,系统也会自动调用ExitThread),系统查看当前映射到进程空间中的所有DLL文件映像,并用DLL_THREAD_DETACH来调用DllMain函数,通知所有的DLL去执行线程级的清理工作。 注意:如果线程的结束是因为系统中的一个线程调用了TerminateThread,系统就不会用值DLL_THREAD_DETACH来调用所有DLL的DllMain函数。 Generated by Bo-blog 2.1.1 Release
相关推荐
从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境
本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。
关于Dll
Dll(动态链接库)的加载分为2种: 静态加载 动态加载 首先来看一个Dll的例子: 上面3张图分别是main.cpp, Test.h以及Test.cpp。其编译连接后生成了一个名为Sample.dll以及对应的Sample.lib导入库。 静态加载是通过如下几种方式使用: 首先可以通过#pragma comment语句来静态使用dll 或者可以通过在项目属性中的附加依赖项添加对应的导入库来静态使用 这种情况下就无需#pragma comment语句了 ...
别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)
本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。
dll的一些常识
1、若显式载入DLL,则当系统第一次调用Library时,进程会将Dll映射到进程的地址空间,并触发DLL_PROCESS_ATTACH事件; 2、若DLL_PROCESS_ATTACH事件返回ture,则表示调用LoadLibrary成功,反之则失败,特别需要注意的是,在这种情况下是没有DLL_PROCESS_DETACH事件触发的; 3、在调用FreeLibrary时,会触发DllMain
世界坐标系/相机坐标系/图像坐标系 转换
目录一、各坐标系简要介绍二、坐标系转换2.1 世界坐标系转为相机坐标系2.2 相机坐标系转为物理图像坐标系2.3 物理图像坐标系转为图像坐标系2.4 总结2.5 为什么要使用齐次坐标参考文献 一、各坐标系简要介绍 首先介绍数字图像处理领域中的图像坐标系,如上图左图所示,坐标系O_0为图像坐标系,其原点是在图像的左上角,每一个像素通过其所在位置的列数和行数索引 (u,v) 来表示。 另外需要建立图像坐标与物理单位的关系,而后才能将目标的真实世界坐标转换为图像坐标。即建立以物理单位表示的物理图像坐标系(有些文
搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础
定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。
DLL调用详解
像所有进程都有一个入口点函数一样,DLL也有一个入口点函数--DllMain。系统在不同的时间调用这个入口点函数,通常用于供DLL进行每个进程或线程的初始化和清除操作。这四个不同时刻分别为DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_TREAD_ATTACH、DLL_TREAD_DETACH。下面进行分别描述 当DLL被初次映射到进程的地址空
Android16 RK3576 Bluetooth source和sink模式切换
摘要:本文介绍了在RK3576平台上实现蓝牙A2DP模式动态切换的修改方案。通过在device配置文件中添加A2DP Sink相关属性,修改Bluetooth模块代码实现:1)在Config.java中增加persist.bluetooth.rka2dpsink属性控制模式切换;2)修改A2dpSinkStreamHandler.java取消音频焦点限制;3)调整btif_a2dp_sink.cc默认授予音频焦点。最终通过设置persist.bluetooth.rka2dpsink属性为true/false
关于dllmain以及dll函数调用的理解。
关于dllmain的百度百科的学习。 一个程序要调用dll里的函数,首先要将此dll文件映射到程序进程的地址空间(从磁盘文件映射到内存地址空间 ,PE文件装载器读取),要把dll文件映射到程序进程的地址空间有两种方法:静态链接和动态链接的LoadLibrary或者LoadLibraryEx 程序要调用DLL里的函数,使用Loadliabrary时,会调用DLLMain函数。 当一个dl...
c++对halcon的动态链接库dll封装及调用(细细讲)
本文详细介绍了将Halcon图像处理算法封装为C++动态链接库(DLL)的完整流程,包括7个关键步骤:1)封装Halcon函数并导出CPP文件;2)在C++项目中配置Halcon环境(包含目录、库目录设置);3)验证Halcon代码;4)创建DLL项目并进行环境配置;5)编辑DLL并导出生成文件(.dll、.lib、.h);6)在主项目中配置DLL调用环境;7)编写测试代码验证功能。通过这个流程实现了Halcon算法的模块化封装和复用,文中提供了具体的配置路径和代码示例,重点说明了环境配置细节和文件结构安排
PSINS工具箱学习(四)捷联惯导更新算法
原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning。
C++-导出类-导出宏-纯虚函数-DllMain函数-调用约定与参数命名
文章目录1.普通类导出2.接口类导出3.调用约定与参数命名4.名字修饰约定5.MFC导出宏6.DLLMain函数7.一个DLL在内存中只有一个实例 在编写应用软件时,代码重用是非常关键的一步,C++编程语言里,为了使编写的dll文件,能够实现重用,必须采取一些规则,否则不同编译器生成的dll,不用重用。首先在dll里编写的类必须导出。如下所示: 1.普通类导出 头文件:DLL_TEST_Export.H #ifndef _DLL_TEST_H #define _DLL_TEST_H // 通过
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
DLL文件_DLLMain函数详解
目录**CODE**1.DLLMain函数类型-APIENTRY CODE //核心的入口函数,动态链接库入口函数 BOOL APIENTRY DllMain( HMODULE hModule, //APIENTRY可以换成WINAPI或者_stdcall 是一种调用约定 DWORD ul_reason_for_call, LPVOID lpReserved )
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
加壳学习系列(二)-壳代码
壳代码Shell.dll的源码和二进制文件信息DLL基础DllMain简介何时调用DllMain 上一节写到了,壳代码是写在shell.dll里的(看雪的大佬写的)。所以分析dll文件就很有必要。 Shell.dll的源码和二进制文件信息 DLL基础 DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。以“DllMain”为关键字。在MSDN的介绍中。The DllMain function is an optional method of e
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
DllMain详解
1DLL的进入/退出函数 1.1 DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。以“DllMain”为关键字,来看看MSDN帮助文档怎么介绍这个函数的。 The DllMain function is an optional method of entry into a dynamic-link library (DLL...
DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析
不知道大家是否思考过一个过程:系统试图运行我们写的程序,它是怎么知道程序起始位置的?很多同学想到,我们在编写程序时有个函数,类似Main这样的名字。是的!这就是系统给我们提供的控制程序最开始的地方(注意这儿是提供给我们的,而实际有比这个还要靠前的main)。于是看到DllMain就可以想到它是干嘛的了:Dll的入口点函数。那何时调用这个函数的呢?以及各种调用场景都传给了它什么参数呢...
进程对DllMain函数的调用规律的研究和分析
不知道大家是否思考过一个过程:系统试图运行我们写的程序,它是怎么知道程序起始位置的?很多同学想到,我们在编写程序时有个函数,类似Main这样的名字。是的!这就是系统给我们提供的控制程序最开始的地方(注意这儿是提供给我们的,而实际有比这个还要靠前的main)。于是看到DllMain就可以想到它是干嘛的了:Dll的入口点函数。那何时调用这个函数的呢?以及各种调用场景都传给了它什么参数呢?(转载请指明出
对DllMain的误解
一直以来对DllMain的了解也就局限于,实验性的在DllMain里面写上: cout 我在DllMain里面这样写的代码:BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){
DLL专题之DllMain函数
DllMain函数,并没有什么好讲的.不就是加载和卸载DLL的时候用嘛!实际上,也不是这样.在一些高级应用中是很有用处的.今天,我们只是简单的测试测试.没有什么技术含量的.呵呵.那我们就看看吧:首先,老步骤,建立一个Win32 DynamicLink(dll)选择一个简单的工程.,代码如下:头文件:#ifndef _DLLMAIN_DLL_H_#define _DLLMAIN_DLL_
4-DllMain详解
当线程C执行DIlMain函数中的代码时,线程B创建线程D,此时系统必须再次用DLL_THREAD_ATTACH来调用SomeDLL.dll的DllMain函数,但这次是让线程D来执行其中的代码。DllMain函数执行的时候,Windows会为它创建一个加载器锁,加载器锁可以被任意需要访问加载到进程中的DLL列表的函数获取到,这其中包括GetModuleHandle和GetModuleFileName之类的函数。DLL的入口函数一般被用作根据不同的通知信号,来执行相关的进程或线程的初始化和清理工作,
DLL程序入口DllMain详解
DLL程序入口点函数:DllMain,注意:大小写是区别的(仅导出资源的DLL可以没有DllMain函数)。 函数原型: [cpp] view plain copy print? BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reaso
DllMain
The DllMain function is an optional entry point into a dynamic-link library (DLL). If the function is used, it is called by the system when processes and threads are initialized and terminated, or upo
489



被折叠的 条评论
为什么被折叠?



