DLL程序入口点函数:DllMain。注意:大小写是区别的

仅导出资源的DLL可以没有DllMain函数。

函数原型:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

参数意义:

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

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

*DLL_PROCESS_ATTACH:

当DLL被进程第一次调用时,导致DllMain函数被调用,同时ul_reason_for_call的值为DLL_PROCESS_ATTACH,

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

*DLL_PROCESS_DETACH:

当DLL被从进程的地址空间解除映射时,系统调用了它的DllMain,传递的ul_reason_for_call值是DLL_PROCESS_DETACH。我们应当在此处放置一些清理代码。

★如果进程的终结是因为调用了TerminateProcess,系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。这就意味着DLL在进程结束前没有机会执行任何清理工作。

*DLL_THREAD_ATTACH:

当进程创建一线程时,系统查看当前映射到进程地址空间中的所有DLL文件映像,并用值DLL_THREAD_ATTACH调用DLL的DllMain函数。 新创建的线程负责执行这次的DLL的DllMain函数,只有当所有的DLL都处理完这一通知后,系统才允许线程开始执行它的线程函数。

*DLL_THREAD_DETACH:

如果线程调用了ExitThread来结束线程(线程函数返回时,系统也会自动调用ExitThread),系统查看当前映射到进程空间中的所有DLL文件映像,并用DLL_THREAD_DETACH来调用DllMain函数,通知所有的DLL去执行线程级的清理工作。

★注意:如果线程的结束是因为系统中的一个线程调用了TerminateThread,系统就不会用值DLL_THREAD_DETACH来调用所有DLL的DllMain函数。

③lpReserved参数:保留,目前没什么意义。

DllMain的序列化调用

举个例子:

进程中有两个线程,A与B。进程的地址空间中,映射了一个名为SomeDll.dll的DLL。两个线程都准备通过CreateThread来创建另两个线程,C和D。

当线程A调用CreateThread来创建线程C的时候,系统会用DLL_THREAD_ATTACH来调用SomeDll.dll的DllMain,当线程C执行其中代码的时候,线程B调用CreateThread来创建线程D。这时,系统同样会用DLL_THREAD_ATTACH来调用SomeDll.dll的DllMain,这次是让线程D来执行其中的代码。

但是此时,系统会对DllMain执行序列化,它会将线程D挂起,直至线程C执行完DllMain中的代码返回为止。

当C线程执行完DllMain中的代码并返回时,可以继续执行C的线程函数。此时,系统会唤醒线程D,让D执行DllMain中的代码。当返回后,线程D开始执行线程函数。

本文章转载https://blog.csdn.net/u011555996/article/details/77945081;https://blog.csdn.net/birdflyto206/article/details/51541798

本文章只是对转载文章整理一下格式,便于阅读~

DllMain——DLL程序入口点函数相关推荐

  1. DLL入口点函数DllMain

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

  2. DLL入口点函数DllMain .

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

  3. Windows应用程序类型和相应的入口点函数

    Windows应用程序类型和相应的入口点函数,Windows编程真难啊.. 来源:大神的书 Windows核心编程 第五版

  4. windows下如何使用QT编写dll程序 .

    Windows 下如何使用 QT 编写 dll 程序 因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行.所以说如果我们使用了 QT ...

  5. 成功解决python.exe 无法找到程序入口 无法定位程序输入点

    成功解决python.exe 无法找到程序入口 无法定位程序输入点 导读:此文为博主编写代码过程笔记. 目录 解决问题 解决方法 参考网友推荐答案 第一位网友的建议 第二位网友的建议 相关文章:成功解 ...

  6. illustrator插件开发-AI插件-aip格式-第一章 第二小节 入口点函数

    文章目录 1.入口点函数 2.作者答疑 1.入口点函数   插件作为illustrator软件的一部分,需要与主体程序进行通信,必然需要约定调用函数.而入口点函数就是其中关键一环,实例代码如下: /* ...

  7. ORB_SLAM2程序入口(System.cc)

    程序入口   ORB_SLAM2的程序入口为src/System.cc.在CMakeList.txt中可知,ORB_SLAM2的可执行程序为: Examples/Stereo/stereo_kitti ...

  8. 在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

    在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为"true"即可.

  9. 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )

    文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...

  10. Flume 1.7 源码分析(三)程序入口

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

最新文章

  1. php获取日期对应的星期,PHP获取日期对应的星期
  2. Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)
  3. 前端怎么导出表格_前端如何导出表格数据
  4. 红包实名的背后,支付实名制如何影响产品设计?
  5. Android开发实践:利用ProGuard进行代码混淆
  6. C# 读取指定目录中的所有文件,并按规则生成SQL语句!
  7. 算法(5)-leetcode-explore-learn-数据结构-字符串
  8. 低版本VC2010打开高版本VC2012的方法
  9. 博途v14电脑要求_博途v15对电脑配置要求
  10. css全局加粗,CSS 实现矩形四个边角加粗的方法
  11. 【瑞芯微RK3188 VS 全志A31】性能向多项目对比评测
  12. 可以在搜索中突出显示网页上的多个单词_使用片段嵌入进行文档搜索
  13. 我的世界正版验证服务器地址,我的世界1.7.10服务器纯净地址大全
  14. Windows环境下不用第三方程序给新硬盘提前预装Windows系统
  15. 搜狗输入法 linux 卸载,ubuntu彻底卸载搜狗拼音输入法
  16. 北京有两个百度,李彦宏只有一个陆奇
  17. VSCODE配置C/C++
  18. html5泡泡龙游戏开发随笔
  19. 浏览器被恶意篡改(百分百成功)
  20. 【服务器数据恢复】Storwize系列存储raid5数据恢复案例

热门文章

  1. 2021年安全员-C证(山东省-2020版)考试及安全员-C证(山东省-2020版)模拟试题
  2. java手机连点脚本_自动点击连点器下载
  3. java毕业设计(论文)答辩提纲,毕业论文答辩提纲模板.doc
  4. Zabbix5系列-监控惠普服务器iLO管理口 (六)
  5. [ PyQt入门教程 ] Qt Designer工具的使用
  6. 示教器重定位下机器人动作_ABB机器人示教器入门-初级教学|干货
  7. js将阿拉伯数字转换成汉字大写
  8. 合并两个有序链表-python
  9. html展开折叠菜单,纯CSS竖向滑动展开折叠菜单
  10. 计算机快捷键大全列表6,快捷键大全excel