`
yiyeqinghuasoon
  • 浏览: 649236 次
文章分类
社区版块
存档分类
最新评论

dll的一些细节

 
阅读更多

跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。DllMain是一个可选的Dll入口方法。一个动态链接库不一定要有DllMain函数,像很多仅仅包含资源信息的DLL是没有DllMain函数的。
静态链接、动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。DllMain的第三个参数fdwReason指明了系统调用Dll的原因,它们分别是:
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函数。


DLL_PROCESS_DETACH:
当DLL被从进程的地址空间解除映射时,系统调用了它的DllMain,传递的fdwReason值是DLL_PROCESS_DETACH。当DLL处理该值时,它应该执行进程相关的清理工作。
DLL被从进程的地址空间解除映射有两种情况:
◆FreeLibrary解除DLL映射(有几个LoadLibrary,就要有几个FreeLibrary)
◆进程结束而解除DLL映射,在进程结束前还没有解除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函数。


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函数,哪怕是线程中建立线程也一样。


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

分享到:
评论

相关推荐

    Delphi调用c++ DLL技术文档

    本文档说明了Delphi调用c++ dll的一些技术细节,讲述了如何调用c++的动态链接库接口技术

    自己写的dll的简介

    为所有的类声明加上__declspec(dllexport)关键字,这有这样编译器才能自动为你产生引入库文件(否则你需要自己写.def文件来产生,因为不常用所以在此不再阐述其细节) 对于DLL的用户来讲,类声明就需要用另外一个...

    DLL劫持-Hijack-原理及其实现细节

    DLL劫持-Hijack-原理及其实现细节

    如何制作dll示例参考工程

    这是一个将项目制作成dll的参考工程,关于细节方面,请转到我的博客详细参考,谢谢

    DLL创建与函数调用规则

    详述函数调用规则及DLL创建, 但非细节,解释DLL的几种类型

    qt创建带窗口的dll库,并测试效果

    前言,看到网上很多相关的帖子,但是有些小细节介绍的不够详细,所以想写一篇入手篇,以供新手参考;另外注意,如果增加了资源文件,需要qmake一下,否则可能会构建失败; 详细说明:...

    QT生成带界面的dll给c#调用

    本资源包括4个文件夹,myQtMainWindowDll文件夹里面是qt的工程文件;build-qtdll-Desktop_Qt_5_12_2_MSVC2015_64bit-...具体使用细节参见我的博客:https://blog.csdn.net/weixin_43935474/article/details/105531814

    delphi调用tuxedo服务编写为dll详解

    1。如何编写dll,示例两个,一个是double参数的,一个是字符串pchar的传入传出的;...环境如何搭建的,如何进行调用的,例子很简单实用,细节描述也非常详细 绝对原创,7是我的幸运数字,7分绝对物有所值

    MySql.Data.dll For C#

    提供了C#下的MySql操作 可以像操作Sqlserver一样的操作Mysql 有关具体操作细节 http://download.csdn.net/source/3555627

    .NET Reflector dll反编译器

    绝大多数熟悉.NET开发的朋友对于Reflector for .NET这款类浏览及反编译软件都不会感到陌生,尤其是当我们想要进一步窥探.NET框架及其它.NET程序内部细节的时候,它总是能够给我们提供非常高效有力的帮助。...

    动态加载EXE和DLL

    细节性问题,请直接双击Project1.dpr文件进入演示代码,了解更多。演示代 码中动态加载了MemRun.dll文件,动态调用了5555044.exe文件,如果你想更换 动态调用的EXE文件,只需要用其它EXE覆盖5555044.exe文件并双击...

    工行银企互联nc模式封装DLL(.net)

    使用vs2017 .net4.0开发设计的dll,屏蔽了底层通讯、签名、编码解码、压缩解压缩等技术细节,动态调整报文时间,日志文件输出,能极大减轻开发人员工作量。输入xml报文,即可获取交易结果。rar包含了如何使用该DLL...

    pdflib.dll 7.0.5

    PDFlib 让您无需再关注 PDF 的内部细节问题,并 提供了各种方法来帮助您设置输出的格式。发布软件包在同一个二进制文件中包含了不同 的产品: > PDFlib 包含创建 PDF 输出(包括文本、矢量图形和图像以及超文本元素...

    完美解决matplotlib、numpy出现DLL load failed:找不到模块

    完美解决matplotlib、numpy出现DLL load failed:找不到模块,试了很多方法都不行,这个方法可以解决 错误细节:Traceback(most recent call last) import matplotlib.pyplot as plt _chek_versions() ffrom . ...

    foobar2000的DSP插件foo_dsp_delta.dll

    foobar2000 DSP 插件 foo_dsp_delta.dll听起来音频效果加强、锐化,就像音频细节被放大了,使人听起来更清晰。我的设置值是128、132、148、162、168.

    urlrewrite.dll

    urlrewrite,实现伪静态页面,UrlRewrite技术隐藏实现细节,这样修改移植都很方便,而且完全不损失pagerank

    devexpress 15.2 汉化包dll 工程源码

    DevExpress15.2官方汉化+大量细节修正.用法极简单. 直接在你的应用程序目录下新建一个目录 <zh-hans> 把压缩包里的 所有dll复制过去就行了! 你自己的程序不用修改一个字的代码,也不用重新编译!

    PSIM中Dll变量设置区别.doc

    在PSIM(电力系统交互式模拟器)中,用户可以通过编写自定义C语言代码来扩展仿真功能,并将其封装为...请注意,具体的实现细节可能会因PSIM的不同版本而有所差异,建议查阅最新的PSIM用户手册或API文档以获取具体指导。

    dll反编译工具

    我们的项目有很多框架,有的项目直接引用的dll,没法知道里面的具体细节,而很多时候需要进去了解细节,所以需要进行反编译。

    点量Http/FTP多线程断点续传下载组件DLL

    点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持...

Global site tag (gtag.js) - Google Analytics