DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数 DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。

DLL程序入口点函数:DllMain,注意:大小写是区别的(仅导出资源的DLL可以没有DllMain函数)。

函数原型:

  1. BOOL APIENTRY DllMain( HMODULE hModule,
  2. DWORD  ul_reason_for_call,
  3. LPVOID lpReserved
  4. )
  5. {
  6. return TRUE;
  7. }

参数意义:

①hModule参数:指向DLL本身的实例句柄;

②ul_reason_for_call参数:指明了DLL被调用的原因,可以有以下4个取值:


1. DLL_PROCESS_ATTACH:
当DLL被进程 <<第一次>> 调用时,导致DllMain函数被调用,

同时ul_reason_for_call的值为DLL_PROCESS_ATTACH,

如果同一个进程后来再次调用此DLL时,操作系统只会增加DLL的使用次数,

不会再用DLL_PROCESS_ATTACH调用DLL的DllMain函数。


2.DLL_PROCESS_DETACH:
当DLL被从进程的地址空间解除映射时,系统调用了它的DllMain,传递的ul_reason_for_call值是DLL_PROCESS_DETACH。
★如果进程的终结是因为调用了TerminateProcess,系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。这就意味着DLL在进程结束前没有机会执行任何清理工作。


3.DLL_THREAD_ATTACH:
当进程创建一线程时,系统查看当前映射到进程地址空间中的所有DLL文件映像,

并用值DLL_THREAD_ATTACH调用DLL的DllMain函数。 

新创建的线程负责执行这次的DLL的DllMain函数,

只有当所有的DLL都处理完这一通知后,系统才允许线程开始执行它的线程函数。


4.DLL_THREAD_DETACH:
如果线程调用了ExitThread来结束线程(线程函数返回时,系统也会自动调用ExitThread),

系统查看当前映射到进程空间中的所有DLL文件映像,

并用DLL_THREAD_DETACH来调用DllMain函数,

通知所有的DLL去执行线程级的清理工作。
★注意:如果线程的结束是因为系统中的一个线程调用了TerminateThread,

系统就不会用值DLL_THREAD_DETACH来调用所有DLL的DllMain函数。

 

③lpReserved参数:隐士加载和显示加载时,此参数值不一样,显示加载时为零,如果用户希望限定动态链接库的加载形式可以通过判断这个参数的值实现。

动态库的隐示加载 需要头文件 lib文件 dll文件 程序运行时dll也要加载到内容 但多个程序使用dll时  内存中只用一份dll
  动态库的显示加载 只需要dll文件即可 程序运行时不加载dll 只有在loadlibrary 使用库函数时才加载dll
  动态库的延迟加载其实是动态库的隐示加载和显示加载的合并 需要头文件 lib文件 dll文件 只是程序运行时不加载dll,在程序使用时才加载dll,此时的原理与显示加载的原理一样。编译器选项中配置 link>delay load dll一项需要填入加载的动态库文件
程序运行时需要知道动态库的路径 可以通过setdlldirctrory()可以指定动态库的路径

转载于:https://www.cnblogs.com/KunLunSu/p/7435430.html

Dllmain的作用相关推荐

  1. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

    有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...

  2. DLL入口点函数DllMain

     每个DLL都可以有一个入口点函数DllMain,系统会在不同的时刻调用此函数.以下是DllMain的一般形式: BOOL WINAPI DllMain(HINSTANCE hinstDLL, / ...

  3. 导致DllMain中死锁的关键隐藏因子

    原文地址:https://blog.csdn.net/hczhiyue/article/details/18505087 有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作 ...

  4. DLL入口点函数DllMain .

    每个DLL都可以有一个入口点函数DllMain,系统会在不同的时刻调用此函数.以下是DllMain的一般形式: BOOL WINAPI DllMain( HINSTANCE hinstDLL, // ...

  5. Object的finalize()方法的作用是否与C++的析构函数作用相同

    Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...

  6. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  7. 【B/S实践】解决:vs中修改样式表后不起作用的问题

    缓存,有好多,cpu和内存之间的三级缓存,浏览器内的缓存! 缓存是因为速率不对等,通过缓存来加速内容的显示! 今天我在敲牛腩的时候遇到一个问题,找了半小时,才发现是缓存导致的问题! 试着运行aspx文 ...

  8. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

  9. 机器学习——标准化/归一化的目的、作用和场景

    对每个特征进行归一化处理,使得每个特征的取值缩放到0~1之间.这样做有两个好处: 模型训练更高效. 特征前的权重大小可代表该变量对预测结果的贡献度(因为每个特征值本身的范围相同). (一)归一化的作用 ...

  10. Linux操作系统下文件作用

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

最新文章

  1. wxPython:Python首选的GUI库 | CSDN博文精选
  2. Angela启动步骤
  3. linux 预加载 动态链接库rootkit 简介
  4. DL-1 用一元二次方程 y=x^2+b 构建神经网络
  5. 360oauth token是什么意思_我在BOSS直聘上都和面试官聊了些什么?
  6. 强大的金融类图表库 TradingView 使用分享
  7. SAP Cloud for Customer里图片数据读取的逻辑
  8. oracle to pgsql,PostgresToOracle
  9. JNI中访问JList的代码
  10. nginx基本原理介绍
  11. 火电厂给水串级控制系统仿真
  12. spring security 源码解析
  13. Java Spring 框架详解
  14. 基础了解虚拟 DOM
  15. 访问WebServcie遇到配额不足的时候,请增加配额
  16. Centos7虚拟机网卡做bond(一)
  17. SAP HANA XS ODATA的写法
  18. 玩转iOSARkit以及3D模型
  19. 1348:【例4-9】城市公交网建设问题——Kruskal算法
  20. 史上最全的Schnorr签名方案和BLS签名方案的全面对比

热门文章

  1. Java实现选择排序和冒泡排序
  2. 浙大翁凯老师Java课堂学习记录(第二周)
  3. 计算理论导论第1章答案 Michael Sipser
  4. linux系统服务器如何登陆,linux系统如何登录到远程linux服务器
  5. hp微型计算机网线怎么安装,惠普M1130网络打印机怎么安装设置?
  6. Petalinux配置
  7. 【气象检测项目】BME280
  8. ESP8266-Arduino网络编程实例-BME280传感器数据仪表显示
  9. 升级opengl和显卡驱动_又更新了!英伟达OpenGL 4.4显卡驱动下载
  10. 论文速读:Homography Loss for Monocular 3D Object Detection