DllMain, 实现之前先看清楚文档
微软文档的质量是很不错的,需要强调的地方基本上都写的很清楚。可是总有一些人写代码不仔细看文档,埋了许多地雷自己都不知道。
DllMain函数和其他函数实现起来相比,有许多需要注意的地方,MSDN中说的很清楚。
DllMain Callback Function介绍的Remarks部分:
http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx
Best Practices for Creating DLLs:
http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx
总之要非常小心,防止死锁,防止被调用函数依赖的动态库还没有加载。
最近遇到一个问题,客户机器登录之后就重启,无法使用。重启是由winlogon导致的,windbg内核调试和Application Verifier分析发现,一个组件竟然在DllMain中调用了CoInitialize和CoUninitialize,结果导致winlogon释放Com接口时出现异常。CoInitialize的文档中说的很清楚,不要在DllMain中调用CoInitialize或CoInitializeEx 或CoUninitialize。实际的初始化逻辑工作根本没有必要放在DllMain中,DllMain中最好只进行最简单的初始化工作。