• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-05-30 22:33 Aet 隐藏边栏 |   抢沙发  6 
文章评分 2 次,平均分 5.0

概述

  1. DllMainWindows 动态链接库(DLL)的入口函数,类似于可执行程序的 main 函数
  2. 它在以下四种情况下会被系统自动调用:
    1. DLL 被加载到进程内存
    2. DLL 被卸载
    3. 进程创建新线程
    4. 线程退出

参数

  1. 保留参数 lpReserved
    DLL_PROCESS_ATTACH时为NULL
    DLL_PROCESS_DETACH时表示卸载方式

返回值

  1. 返回 TRUEDLL 初始化成功
  2. 返回 FALSE(仅对DLL_PROCESS_ATTACH有效):DLL 会被立即卸载

注意

  1. 禁止在DllMain中执行的操作

  1. 当多个线程同时加载/卸载 DLL 时:

场景

DLL_PROCESS_ATTACH

  1. DLL 首次被加载到进程地址空间时

DLL_PROCESS_DETACH

  1. DLL 即将被卸载(进程退出或调用FreeLibrary

DLL_THREAD_ATTACH

  1. 进程创建新线程时(该线程第一次调用DLL函数前)

DLL_THREAD_DETACH

  1. 线程退出时(线程正常退出前)

问题

  1. 关于创建线程触发DLL_THREAD_ATTACH的具体细节
    1. 总结就是:
    2. 当进程内创建任何新线程时(通过 CreateThread_beginthreadexAPI),所有已加载到该进程的 DLL 都会收到 DLL_THREAD_ATTACH 通知
    3. 但是,主线程(进程启动时的第一个线程)不会触发 DLL_THREAD_ATTACH
    4. 另外,如果动态库加载前已存在的线程:若线程在 DLL 被加载(LoadLibrary)之前就已创建,则该线程不会触发其 DLL_THREAD_ATTACH
    5. 动态库加载失败:如果 DLLDLL_PROCESS_ATTACH 阶段返回 FALSE,则后续线程创建不会触发它的 DLL_THREAD_ATTACH
条件 是否触发 说明
进程启动时创建主线程 主线程触发 DLL_PROCESS_ATTACH,不触发 DLL_THREAD_ATTACH
进程中新建任何线程 新线程触发所有已加载 DLLDLL_THREAD_ATTACH(无论是否调用其函数)
调用动态库的导出函数 函数调用在现有线程中运行,不会创建新线程,因此不触发
动态库被其他模块加载 加载行为本身只触发 DLL_PROCESS_ATTACH

示例

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享