The DllMain function is an optional method of entry into a dynamic-link library (DLL)。(简要翻译:对于动态链接库,DllMain是一个可选的入口函数。)这句话很重要,很多初学者可能都认为一个动态链接库肯定要有DllMain函数。其实不然,像很多仅仅包含资源信息的DLL是没有DllMain函数的。

函数定义:

系统是在什么时候调用DllMain函数的呢?静态链接时,或动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。DllMain的第二个参数fdwReason指明了系统调用Dll的原因,它可能是::

DLL_PROCESS_ATTACH、

DLL_PROCESS_DETACH、

DLL_THREAD_ATTACH、

DLL_THREAD_DETACH。

以下从这四种情况来分析系统何时调用了DllMain。

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函数。

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在进程结束前没有机会执行任何清理工作。)

相关查询: DllMain function optional dynamic-link library 这句话 初学者 其实不然
最新查询:土地治理 纯血种 传统式 ���ٹ� 有机磷 鸟铳 鲜虾焖鸡 化工工业气体分析仪表 东莞市 千伏安 宁夏区级非物质文化遗产名录 精英P4S5AS 轻子 比利时 庞雨珠 鵱CRM 隆美尔竹笋 真核细胞 孟大底鲨 没修饰的印记 副代表 马蹄煲龙骨汤 永兴岛 保险费率 大甲溪 申请表 CorelDRAW 小郎 江美华 火炬北极贝 布姓 信阳市 类型化 圣斯威逊节 正弦曲线 商业系统 证券化 平乐县 柯尔特M1873单动式转轮手枪 育空河 游汀村 嘿格村 王茜 全日制 秘制香辣烤鲫鱼 德拉姆上同调 中医师 巨人卡里 野葱拌豆腐 椒盐富贵笋 Mara 微处理器 麦莉·赛勒斯演唱会纪实 水果核桃蛋糕 芝麻豆沙江米饼 ³ɴ 方皓玟 反向设计 魔术气球 云雪散 极火虾 殖民统治 一汽大众车系维修案例精选 化肥工业发展史 合成氨 不论什么 国际音理会 血细胞 尖椒松花蛋 洋芋礤礤 西斯·弗洛克哈特 彭龙飞 有形资产 油豆腐粉丝 神龙川风景区 安徽九华山 保用期 同流合污 QQ华夏第一氏族争霸赛 DllMain
友情链接: 知道 电影 百科 好搜 问答 微信 值得买 巨便宜 天天特价 洛阳汽车脚垫 女装 女鞋 母婴 内衣 零食 美妆 汽车 油价 郑州 北京 上海 广州 深圳 杭州 南京 苏州 武汉 天津 重庆 成都 大连 宁波 济南 西安 石家庄 沈阳 南阳 临沂 邯郸 保定 温州 东莞 洛阳 周口 青岛 徐州 赣州 菏泽 泉州 长春 唐山 商丘 南通 盐城 驻马店 佛山 衡阳 沧州 福州 昆明 无锡 南昌 黄冈 遵义
© 2025 haodianxin 百科 豫ICP备14030218号-3 消耗时间:0.032秒 内存2.83MB